home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 April / PCWorld_2008-04_cd.bin / v cisle / ozo / zotero-1.0.3.xpi / scrapers.sql < prev    next >
Text File  |  2008-02-01  |  785KB  |  22,556 lines

  1. -- 258
  2.  
  3. --  ***** BEGIN LICENSE BLOCK *****
  4. --  
  5. --  Copyright (c) 2006  Center for History and New Media
  6. --                      George Mason University, Fairfax, Virginia, USA
  7. --                      http://chnm.gmu.edu
  8. --  
  9. --  Licensed under the Educational Community License, Version 1.0 (the "License");
  10. --  you may not use this file except in compliance with the License.
  11. --  You may obtain a copy of the License at
  12. --  
  13. --  http://www.opensource.org/licenses/ecl1.php
  14. --  
  15. --  Unless required by applicable law or agreed to in writing, software
  16. --  distributed under the License is distributed on an "AS IS" BASIS,
  17. --  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18. --  See the License for the specific language governing permissions and
  19. --  limitations under the License.
  20. --  
  21. --  ***** END LICENSE BLOCK *****
  22.  
  23.  
  24. -- Set the following timestamp to the most recent scraper update date
  25. REPLACE INTO version VALUES ('repository', STRFTIME('%s', '2008-02-02 00:00:00'));
  26.  
  27. REPLACE INTO translators VALUES ('96b9f483-c44d-5784-cdad-ce21b984fe01', '1.0.0b4.r1', '', '2007-06-21 20:00:00', '1', '100', '4', 'Amazon.com', 'Sean Takats', '^https?://(?:www\.)?amazon', 
  28. 'function detectWeb(doc, url) { 
  29.  
  30.     var suffixRe = new RegExp("https?://(?:www\.)?amazon\.([^/]+)/");
  31.     var suffixMatch = suffixRe.exec(url);
  32.     var suffix = suffixMatch[1];
  33.     var searchRe = new RegExp(''^https?://(?:www\.)?amazon\.'' + suffix + ''/(gp/search/|exec/obidos/search-handle-url/|s/)'');
  34.     if(searchRe.test(doc.location.href)) {
  35.         return "multiple";
  36.     } else {
  37.         var namespace = doc.documentElement.namespaceURI;
  38.         var nsResolver = namespace ? function(prefix) {
  39.             if (prefix == ''x'') return namespace; else return null;
  40.         } : null;
  41.         
  42.         var xpath = ''//input[@name="ASIN"]'';
  43.         if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  44.             var elmt = doc.evaluate(''//input[@name="storeID"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  45.             if(elmt) {
  46.                 var storeID = elmt.value;
  47.                 Zotero.debug("store id: " + storeID);
  48.                 if (storeID=="books"){
  49.                     return "book";
  50.                 }
  51.                 else if (storeID=="music"){
  52.                     return "audioRecording";
  53.                 }
  54.                 else if (storeID=="dvd"|storeID=="video"){
  55.                     return "videoRecording";
  56.                 }
  57.                 else {
  58.                     return "book";
  59.                 }
  60.             }
  61.             else {
  62.                 return "book";
  63.             }
  64.         }
  65.     }
  66. }
  67. ', 
  68. 'function doWeb(doc, url) {
  69.     var namespace = doc.documentElement.namespaceURI;
  70.     var nsResolver = namespace ? function(prefix) {
  71.             if (prefix == ''x'') return namespace; else return null;
  72.         } : null;
  73.         
  74.     var suffixRe = new RegExp("https?://(?:www\.)?amazon\.([^/]+)/");
  75.     var suffixMatch = suffixRe.exec(url);
  76.     var suffix = suffixMatch[1];
  77.  
  78.     var searchRe = new RegExp(''^https?://(?:www\.)?amazon\.'' + suffix + ''/(gp/search/|exec/obidos/search-handle-url/|s/)'');
  79.     var m = searchRe.exec(doc.location.href);
  80.     var uris = new Array();
  81.     if (suffix == "co.jp"){
  82.         suffix = "jp";
  83.     }
  84.     if(m) {
  85.         var xpath = ''//a/span[@class="srTitle"]'';
  86.         var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  87.         var elmt = elmts.iterateNext();
  88.         var asins = new Array();
  89.         var availableItems = new Array();
  90.         var i = 0;
  91.         var asinRe = new RegExp(''/(dp|product)/([^/]+)/'');
  92.  
  93.         do {
  94.             var link = doc.evaluate(''../@href'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  95.             var searchTitle = elmt.textContent;
  96.             availableItems[i] = searchTitle;
  97.             var asinMatch = asinRe.exec(link);
  98.             asins[i] = asinMatch[2];
  99.             Zotero.debug(searchTitle + " @ " + asins[i]);
  100.             i++;
  101.         } while (elmt = elmts.iterateNext());
  102.         var items = Zotero.selectItems(availableItems);
  103.         
  104.         if(!items) {
  105.             return true;
  106.         }
  107.         
  108.         for(var i in items) {
  109.             uris.push("http://ecs.amazonaws." + suffix + "/onca/xml?Service=AWSECommerceService&Version=2006-06-28&Operation=ItemLookup&SubscriptionId=0H174V5J5R5BE02YQN02&ItemId=" + asins[i] + "&ResponseGroup=ItemAttributes");
  110.         }
  111.         
  112.     } else {
  113.         var elmts = doc.evaluate(''//input[@name = "ASIN"]'', doc,
  114.                            nsResolver, XPathResult.ANY_TYPE, null);
  115.         var elmt;
  116.         while(elmt = elmts.iterateNext()) {
  117.             var asin = elmt.value;
  118.         }
  119.         uris.push("http://ecs.amazonaws." + suffix + "/onca/xml?Service=AWSECommerceService&Version=2006-06-28&Operation=ItemLookup&SubscriptionId=0H174V5J5R5BE02YQN02&ItemId=" + asin + "&ResponseGroup=ItemAttributes");
  120.     }
  121.     
  122.     Zotero.Utilities.HTTP.doGet(uris, function(text) {
  123.         text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
  124.         var texts = text.split("<Items>");
  125.         texts = texts[1].split("</ItemLookupResponse>");
  126.         text = "<Items>" + texts[0];
  127.         var xml = new XML(text);
  128.         Zotero.debug(text);
  129.  
  130.         var publisher = "";
  131.         if (xml..Publisher.length()){
  132.             publisher = Zotero.Utilities.cleanString(xml..Publisher[0].text().toString());
  133.         }
  134.         
  135.         var binding = "";
  136.         if (xml..Binding.length()){
  137.             binding = Zotero.Utilities.cleanString(xml..Binding[0].text().toString());
  138.         }
  139.         
  140.         var productGroup = "";
  141.         if (xml..ProductGroup.length()){
  142.             productGroup = Zotero.Utilities.cleanString(xml..ProductGroup[0].text().toString());
  143.         }
  144.             
  145.         if (productGroup=="Book") {
  146.             var newItem = new Zotero.Item("book");
  147.             newItem.publisher = publisher;
  148.         }
  149.         else if (productGroup == "Music") {
  150.             var newItem = new Zotero.Item("audioRecording");
  151.             newItem.label = publisher;
  152.             newItem.audioRecordingType = binding;
  153.             for(var i=0; i<xml..Artist.length(); i++) {
  154.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Artist[i].text().toString(), "performer"));
  155.             }
  156.         }
  157.         else if (productGroup == "DVD" | productGroup == "Video") {
  158.             var newItem = new Zotero.Item("videoRecording");
  159.             newItem.studio = publisher;
  160.             newItem.videoRecordingType = binding;
  161.             for(var i=0; i<xml..Actor.length(); i++) {
  162.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Actor[i].text().toString(), "castMember"));
  163.             }
  164.             for(var i=0; i<xml..Director.length(); i++) {
  165.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Director[i].text().toString(), "director"));
  166.             }        
  167.         }
  168.         else{
  169.             var newItem = new Zotero.Item("book");
  170.             newItem.publisher = publisher;
  171.         }
  172.         
  173.         if(xml..RunningTime.length()){
  174.             newItem.runningTime = Zotero.Utilities.cleanString(xml..RunningTime[0].text().toString());
  175.         }
  176.         
  177.         // Retrieve authors and other creators
  178.         for(var i=0; i<xml..Author.length(); i++) {
  179.             newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Author[i].text().toString()));
  180.         }
  181.         if (newItem.creators.length == 0){
  182.             for(var i=0; i<xml..Creator.length(); i++) {
  183.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Creator[i].text().toString()));
  184.             }
  185.         }
  186.         
  187.         if (xml..PublicationDate.length()){
  188.             newItem.date = Zotero.Utilities.cleanString(xml..PublicationDate[0].text().toString());
  189.         } else if (xml..ReleaseDate.length()){
  190.             newItem.date = Zotero.Utilities.cleanString(xml..ReleaseDate[0].text().toString());
  191.         }
  192.         if (xml..Edition.length()){
  193.             newItem.edition = Zotero.Utilities.cleanString(xml..Edition[0].text().toString());
  194.         }
  195.         if (xml..ISBN.length()){
  196.             newItem.ISBN = Zotero.Utilities.cleanString(xml..ISBN[0].text().toString());
  197.         }
  198.         if (xml..NumberOfPages.length()){
  199.             newItem.pages = Zotero.Utilities.cleanString(xml..NumberOfPages[0].text().toString());
  200.         }
  201.         var title = Zotero.Utilities.cleanString(xml..Title[0].text().toString());
  202.         if(title.lastIndexOf("(") != -1 && title.lastIndexOf(")") == title.length-1) {
  203.             title = title.substring(0, title.lastIndexOf("(")-1);
  204.         }
  205.         if (xml..ASIN.length()){
  206.             var url = "http://www.amazon." + suffix + "/dp/" + Zotero.Utilities.cleanString(xml..ASIN[0].text().toString());
  207.             newItem.attachments.push({title:"Amazon.com Link", snapshot:false, mimeType:"text/html", url:url});
  208.         }
  209.         
  210.         if (xml..OriginalReleaseDate.length()){
  211.             newItem.extra = Zotero.Utilities.cleanString(xml..OriginalReleaseDate[0].text().toString());
  212.         }
  213.         
  214.         newItem.title = title;
  215.         newItem.complete();            
  216.     }, function() {Zotero.done();}, null);
  217.     Zotero.wait();
  218. }');
  219.  
  220. REPLACE INTO translators VALUES ('aee2323e-ce00-4fcc-a949-06eb1becc98f', '1.0.0b4.r1', '', '2007-08-27 05:00:00', '0', '100', '4', 'Epicurious', 'Sean Takats', '^https?://www\.epicurious\.com/(?:tools/searchresults|recipes/food/views)', 
  221. 'function detectWeb(doc, url){
  222.     var namespace = doc.documentElement.namespaceURI;
  223.     var nsResolver = namespace ? function(prefix) {
  224.         if (prefix == ''x'') return namespace; else return null;
  225.         } : null;
  226.         
  227.     var xpath = ''//div[@id="ingredients"]'';
  228.     var multxpath = ''//table[@class="search-results"]/tbody/tr'';
  229.  
  230.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  231.         return "document";
  232.     } else if (doc.evaluate(multxpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  233.         return "multiple";
  234.     }
  235.     
  236. }', 
  237. 'function cleanText(s){
  238.     s = s.replace(/\n+/g, "\n");
  239.     s = s.replace(/(\n|\r)\t+/g, "\n");  
  240.     s = s.replace(/\t+/g, " ");
  241.     s = s.replace("        ", "", "g");
  242.     return s;
  243. }
  244.  
  245. function scrape(doc){
  246.     var namespace = doc.documentElement.namespaceURI;
  247.     var nsResolver = namespace ? function(prefix) {
  248.         if (prefix == ''x'') return namespace; else return null;
  249.         } : null;
  250.  
  251.     var newItem = new Zotero.Item("document");
  252.  
  253.     var xpath = ''//title'';
  254.     var title = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  255.     title = title.substring(0, title.indexOf(" Recipe at Epicurious.com"));
  256.     newItem.title = title;
  257.  
  258.     var elmt;
  259.  
  260.     xpath = ''//p[@class="source"]'';
  261.     var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  262.     if (elmt = elmts.iterateNext()){
  263.         var authordate = elmt.textContent;
  264.         var authordates = authordate.split("|");
  265.         newItem.creators.push(Zotero.Utilities.cleanAuthor(authordates[0], "contributor", true));
  266.         var datestring = authordates[1].toString();
  267.         datestring = datestring.replace("Copyright", "");
  268.         newItem.date = Zotero.Utilities.formatDate(Zotero.Utilities.strToDate(datestring));
  269.         while (elmt = elmts.iterateNext()){
  270.              Zotero.debug("looping?");
  271.              Zotero.debug(elmt.textContent);
  272.             newItem.creators.push(Zotero.Utilities.cleanAuthor(elmt.textContent, "contributor", false));
  273.         }
  274.     }
  275.         
  276.     xpath = ''//div[@id="recipe_intro"]/p'';
  277.     if (elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  278.         var abstract = elmt.textContent;
  279.         abstract = Zotero.Utilities.cleanString(abstract);
  280.         newItem.abstractNote = abstract;        
  281.     }
  282.  
  283.     xpath = ''//div[@id="ingredients"]'';
  284.     if (elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  285.         var ingredients = elmt.textContent;
  286.         ingredients = Zotero.Utilities.superCleanString(ingredients);
  287.         ingredients = cleanText(ingredients);
  288.     }
  289.     xpath = ''//div[@id="preparation"]'';
  290.     if (elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  291.         var prep = elmt.textContent;
  292.         prep = Zotero.Utilities.superCleanString(prep);
  293.         prep = cleanText(prep);
  294.         prep = prep.replace(/\n/g, "\n\n");
  295.     }
  296.     xpath = ''//div[@id="recipe_summary"]/p'';
  297.     if (elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  298.         var serving = elmt.textContent;
  299.         serving = Zotero.Utilities.superCleanString(serving);
  300.         serving = cleanText(serving);
  301.     }
  302. //    notestring = ingredients + "\n\n" + prep + "\n\n" + serving;
  303. //    newItem.notes.push({note:notestring});
  304.     newItem.notes.push({note:ingredients});
  305.     newItem.notes.push({note:prep});
  306.     newItem.notes.push({note:serving});
  307.  
  308.     var url = doc.location.href;
  309.     
  310.     var snapshotURL = url.replace("/views/", "/printerfriendly/");
  311.     newItem.attachments.push({title:"Epicurious.com Snapshot", mimeType:"text/html", url:snapshotURL, snapshot:true});
  312.     newItem.url = url;
  313.     newItem.attachments.push({title:"Epicurious.com Link", snapshot:false, mimeType:"text/html", url:url});
  314.  
  315.     newItem.complete();
  316. }
  317.  
  318. function doWeb(doc, url){
  319.     var namespace = doc.documentElement.namespaceURI;
  320.     var nsResolver = namespace ? function(prefix) {
  321.         if (prefix == ''x'') return namespace; else return null;
  322.         } : null;
  323.  
  324.     var singxpath = ''//div[@id="ingredients"]'';
  325.     var multxpath = ''//table[@class="search-results"]/tbody/tr'';
  326.     if(doc.evaluate(singxpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  327.         // single recipe page
  328.         scrape(doc, url);
  329.     } else if (doc.evaluate(multxpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  330.         var items = new Object();
  331.         var elmtxpath = ''//div[@id="resultstable"]/table[@class="search-results"]/tbody/tr/td[3][@class="name"]/a[@class="hed"]'';
  332.         var elmts = doc.evaluate(elmtxpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  333.         var elmt;
  334.         while (elmt = elmts.iterateNext()) {
  335.             var title = elmt.textContent;
  336.             var link = elmt.href;
  337.             if (title && link){
  338.                 items[link] = title;
  339.             }
  340.         }
  341.         
  342.         var items = Zotero.selectItems(items);
  343.         if(!items) {
  344.             return true;
  345.         }
  346.         
  347.         var urls = new Array();
  348.         for(var i in items) {
  349.             urls.push(i);
  350.         }
  351.         
  352.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  353.         Zotero.wait();    
  354.     }
  355. }');
  356.  
  357. REPLACE INTO translators VALUES ('0dda3f89-15de-4479-987f-cc13f1ba7999', '1.0.0b4.r1', '', '2007-09-08 12:00:00', '0', '100', '4', 'Ancestry.com US Federal Census', 'Elena Razlogova', '^https?://search.ancestry.com/(.*)usfedcen|1890orgcen|1910uscenindex', 
  358. 'function detectWeb(doc, url) {
  359.     var namespace = doc.documentElement.namespaceURI;
  360.     var nsResolver = namespace ? function(prefix) {
  361.         if (prefix == ''x'') return namespace; else return null;
  362.     } : null;
  363.         
  364.     var result = doc.evaluate(''//div[@class="g_container"]/div[@class="g_panelWrap"]/div[@class="g_panelCore"]/div[@class="s_container"]/div[@class="p_rsltList"]'', doc, nsResolver,
  365.                  XPathResult.ANY_TYPE, null).iterateNext();
  366.  
  367.     var rows = doc.evaluate(''//div[@class="g_container"]/div[@class="g_panelWrap"]/div[@class="g_panelCore"]/div[@class="s_container"]/div[@class="p_rsltList"]/table/tbody/tr[@class="tblrow record"]'', 
  368.                 doc, nsResolver, XPathResult.ANY_TYPE, null);
  369.     var row;
  370.     while(row = rows.iterateNext()) {
  371.         links = doc.evaluate(''.//a'', row, nsResolver, XPathResult.ANY_TYPE, null);
  372.         var linkNo=0;
  373.         while(link=links.iterateNext()) {
  374.             linkNo=linkNo+1;
  375.         }
  376.         break;
  377.     }
  378.     
  379.     if(result && linkNo == 2) {
  380.         return "multiple";
  381.     } else {
  382.         var indivRe = /indiv=1/;
  383.         var m = indivRe.exec(doc.location.href);
  384.         var indiv = 0;
  385.         if(m) {
  386.             indiv = 1;
  387.             }
  388.  
  389.         checkURL = doc.location.href.replace("pf=", "").replace("&h=", "");
  390.         if(doc.location.href == checkURL && indiv == 1) {
  391.             return "bookSection";
  392.         }
  393.     } 
  394. }', 
  395. '// this US Federal Census scraper is a hack - so far there is no proper item type in Zotero for this kind of data (added to trac as a low priority ticket)
  396. // this scraper creates proper citation for the census as a whole (should be cited as book)
  397. // but also adds name, city, and state for a particular individual to the citation to make scanning for names & places easier in the middle pane 
  398. // (that''s why the resulting item type is a book section) 
  399. // it also adds all searchable text as a snapshot and a scan of the census record as an image
  400.  
  401. function scrape(doc) {
  402.     var namespace = doc.documentElement.namespaceURI;
  403.     var nsResolver = namespace ? function(prefix) {
  404.         if (prefix == ''x'') return namespace; else return null;
  405.     } : null;
  406.     
  407.     // get initial census data; a proper census record item type should have separate fields for all of these except perhaps dbid
  408.     var info = doc.evaluate(''//div[@class="g_container"]/div[@class="g_panelWrap"]/div[@class="g_panelCore"]/div[@class="g_right"]/div[@class="g_box"]/p/a'', 
  409.         doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();    
  410.         
  411.     if(info) {    
  412.         
  413.         info = info.toString();
  414.         var data = new Array();
  415.         var parts = info.split(/[?&]/);
  416.         for each(var part in parts) {
  417.             var index = part.indexOf("=");
  418.             if(index !== -1) {
  419.                 data[part.substr(0, index)] = part.substr(index+1);
  420.             }
  421.         }
  422.         
  423.         if(data.ln) {
  424.             var lastName = data.ln.replace(/\+/g, " ");
  425.             var firstName = data.fn.replace(/\+/g, " ");
  426.         } else { 
  427.             var lastName = data.fn.replace(/\+/g, " ");
  428.             var firstName = ""; 
  429.         }
  430.         var dOb = data.by; // this does not get saved yet because no field is available; the info is in the snapshot
  431.         if(data.rfd) {
  432.             var yearRe = /([0-9]{4})/;
  433.             var m = yearRe.exec(data.rfd);
  434.             if(m) { 
  435.                 var year = m[1];
  436.             }
  437.         } else { var year = data.ry; }
  438.         var state = data.rs.replace(/\+/g, " "); 
  439.         var county = data.rcnty.replace(/\+/g, " "); // this does not get saved yet because no field is available; the info is in the snapshot
  440.         var city = data.rcty.replace(/\+/g, " "); 
  441.         var dbid = data.dbid;
  442.     }
  443.     
  444.     // set census number for citation - let me know if this can be done in a better way
  445.     var censusYear = 0;
  446.     var censusNo = "";
  447.     var censusNos = new Array("1790", "First", "1800", "Second", "1810", "Third", "1820", "Fourth", "1830", "Fifth", "1840", "Sixth", "1850", "Seventh", "1860", "Eighth", "1870", "Ninth", 
  448.             "1880", "Tenth", "1890", "Eleventh", "1900", "Twelfth", "1910", "Thirteenth", "1920", "Fourteenth", "1930", "Fifteenth")
  449.     for(var i in censusNos) {
  450.             if(censusYear == 1) { censusNo = censusNos[i] };
  451.             if(censusNos[i] == year) { censusYear = 1 } else {censusYear= 0 };
  452.         }
  453.  
  454.     //begin adding item
  455.     var newItem = new Zotero.Item("bookSection");
  456.     newItem.title = city+", "+state; // this is not proper citation but is needed to easily scan for placenames in middle pane
  457.     newItem.publicationTitle = censusNo+" Census of the United States, "+year;
  458.     newItem.publisher = "National Archives and Records Administration";
  459.     newItem.place = "Washington, DC";
  460.     newItem.date = year;
  461.     
  462.     // get snapshot with all searchable text and a simplified link to the record for the URL field
  463.     var dbRe = /db=([0-9a-z]+)/;
  464.     var m = dbRe.exec(doc.location.href);
  465.     if(m) {
  466.         db = m[1];
  467.     }
  468.     var snapshotRe = /recid=([0-9]+)/;
  469.     var m = snapshotRe.exec(doc.location.href);
  470.         if(m) {
  471.         snapshotURL = "http://search.ancestry.com/cgi-bin/sse.dll?db="+db+"&indiv=1&pf=1&recid="+m[1];
  472.         newItem.attachments.push({title:"Ancestry.com Snapshot", mimeType:"text/html", url:snapshotURL, snapshot:true});
  473.         cleanURL = "http://search.ancestry.com/cgi-bin/sse.dll?indiv=1&db="+db+"&recid="+m[1];
  474.         newItem.url = cleanURL;
  475.     }
  476.             
  477.     // add particular individual being surveyed as contributor - this is not proper citation but is needed so one could easily scan for names in middle pane
  478.     var creator = new Array();
  479.     creator.firstName = firstName;
  480.     creator.lastName = lastName;
  481.     creator.creatorType = "contributor";
  482.     newItem.creators.push(creator);
  483.     
  484.     //add proper author for citation
  485.     var creator = new Array();
  486.     creator.lastName = "United States of America, Bureau of the Census";
  487.     creator.creatorType = "author";
  488.     newItem.creators.push(creator);
  489.  
  490.     // get scan of the census image
  491.     var scanInfo = doc.evaluate(''//div[@class="g_container"]/div[@class="g_panelWrap"]/div[@class="g_panelCore"]/div[@class="g_main"]/div[@class="g_outerBox"]/div[@class="s_container"]/div[@class="g_box2"]/table[@class="p_recTable"]/tbody/tr/td[2][@class="recordTN"]/a'', 
  492.         doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  493.     
  494.     if(scanInfo) {
  495.         var scanRe = /iid=([A-Z0-9_-]+)/;        
  496.         var m = scanRe.exec(scanInfo);
  497.         if(m) {
  498.             scanURL = "http://content.ancestry.com/Browse/print_u.aspx?dbid="+dbid+"&iid="+m[1];
  499.             Zotero.debug("scan url: " + scanURL);
  500.         }
  501.     }
  502.     
  503.     if(scanURL){
  504.         Zotero.Utilities.HTTP.doGet(scanURL, function(text) { 
  505.             Zotero.debug("running doGet");
  506.             Zotero.debug(text);
  507.             var imageRe = /950  src="([^"]+)"/;
  508.             var m = imageRe.exec(text);
  509.                 if(m) {
  510.                     imageURL = m[1];
  511.                     Zotero.debug("image url: " + imageURL);
  512.                     newItem.attachments.push({title:"Ancestry.com Image", mimeType:"image/jpeg", url:imageURL, snapshot:true});
  513.                 }
  514.             
  515.             newItem.complete();
  516.             Zotero.done();    
  517.         });    
  518.     } else {
  519.         newItem.complete();
  520.         Zotero.done();
  521.     }
  522. }
  523.  
  524. function doWeb(doc, url) {
  525.     var resultsRegexp = /recid=/;
  526.     if(resultsRegexp.test(url)) {
  527.         scrape(doc);
  528.     } else {
  529.         var namespace = doc.documentElement.namespaceURI;
  530.         var nsResolver = namespace ? function(prefix) {
  531.             if (prefix == ''x'') return namespace; else return null;
  532.         } : null;
  533.         
  534.         // get census year for links to items
  535.         var yearRe = /db=([0-9]+)/;
  536.         var m = yearRe.exec(doc.location.href);
  537.         if(m) {
  538.             year = m[1];
  539.         }
  540.         
  541.         var dbRe = /db=([0-9a-z]+)/;
  542.         var m = dbRe.exec(doc.location.href);
  543.         if(m) {
  544.             db = m[1];
  545.         }
  546.  
  547.         //select items
  548.         var items = new Array();
  549.         var listElts = doc.evaluate(''//div[@class="g_container"]/div[@class="g_panelWrap"]/div[@class="g_panelCore"]/div[@class="s_container"]/div[@class="p_rsltList"]/table/tbody/tr[@class="tblrowalt record"] | //div[@class="g_container"]/div[@class="g_panelWrap"]/div[@class="g_panelCore"]/div[@class="s_container"]/div[@class="p_rsltList"]/table/tbody/tr[@class="tblrow record"]'', 
  550.                 doc, nsResolver, XPathResult.ANY_TYPE, null);
  551.         var recid;
  552.         var link;
  553.         var name;
  554.         while (listElt = listElts.iterateNext()) {        
  555.             recInfo = doc.evaluate(''.//a'', listElt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  556.             var recidRe = /^javascript:go[0-9]+_([0-9]+)/;
  557.             var m = recidRe.exec(recInfo);
  558.             if(m) {
  559.                 recid = m[1];
  560.             }
  561.             link = "http://search.ancestry.com/cgi-bin/sse.dll?indiv=1&db="+db+"&recid="+recid;
  562.             name = doc.evaluate(''.//span[@class="srchHit"]'', listElt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  563.             items[link] = Zotero.Utilities.cleanString(name);
  564.         } 
  565.  
  566.         items = Zotero.selectItems(items);
  567.         if(!items) return true;
  568.  
  569.         var urls = new Array();
  570.         for(var i in items) {
  571.             urls.push(i);
  572.         }
  573.         
  574.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  575.         Zotero.wait();
  576.  
  577.     }
  578. }');
  579.  
  580. REPLACE INTO translators VALUES ('838d8849-4ffb-9f44-3d0d-aa8a0a079afe', '1.0.0b3.r1', '', '2007-12-12 05:00:00', 1, 100, 4, 'OCLC WorldCat FirstSearch', 'Simon Kornblith', '^https?://(?:new)?firstsearch\.oclc\.org[^/]*/WebZ/',
  581. 'function detectWeb(doc, url) {
  582.     var detailRe = /FirstSearch: [\w ]+ Detailed Record/;
  583.     var searchRe = /FirstSearch: [\w ]+ List of Records/;
  584.     
  585.     if(detailRe.test(doc.title)) {
  586.         return "book";
  587.     } else if(searchRe.test(doc.title)) {
  588.         return "multiple";
  589.     }
  590. }',
  591. 'function processURLs(urls) {
  592.     if(!urls.length) {    // last url
  593.         Zotero.done();
  594.         return;
  595.     }
  596.     
  597.     var newUrl = urls.shift();
  598.     
  599.     Zotero.Utilities.HTTP.doPost(newUrl,
  600.     ''exportselect=record&exporttype=plaintext'', function(text) {
  601.         var lineRegexp = new RegExp();
  602.         lineRegexp.compile("^([\\w() ]+): *(.*)$");
  603.         
  604.         var newItem = new Zotero.Item("book");
  605.         newItem.extra = "";
  606.         
  607.         var lines = text.split(''\n'');
  608.         for(var i=0;i<lines.length;i++) {
  609.             var testMatch = lineRegexp.exec(lines[i]);
  610.             if(testMatch) {
  611.                 var match = newMatch;
  612.                 var newMatch = testMatch
  613.             } else {
  614.                 var match = false;
  615.             }
  616.             
  617.             if(match) {
  618.                 // is a useful match
  619.                 if(match[1] == ''Title'') {
  620.                     var title = match[2];
  621.                     if(!lineRegexp.test(lines[i+1])) {
  622.                         i++;
  623.                         title += '' ''+lines[i];
  624.                     }
  625.                     if(title.substring(title.length-2) == " /") {
  626.                         title = title.substring(0, title.length-2);
  627.                     }
  628.                     newItem.title = Zotero.Utilities.capitalizeTitle(title);
  629.                 } else if(match[1] == "Series") {
  630.                     newItem.series = match[2];
  631.                 } else if(match[1] == "Description") {
  632.                     var pageMatch = /([0-9]+) p\.?/
  633.                     var m = pageMatch.exec(match[2]);
  634.                     if(m) {
  635.                         newItem.pages = m[1];
  636.                     }
  637.                 } else if(match[1] == ''Author(s)'' || match[1] == "Corp Author(s)") {
  638.                     var yearRegexp = /[0-9]{4}-([0-9]{4})?/;
  639.                     
  640.                     var authors = match[2].split('';'');
  641.                     if(authors) {
  642.                         newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[0], "author", true));
  643.                         for(var j=1; j<authors.length; j+=2) {
  644.                             if(authors[j-1].substring(0, 1) != ''('' && !yearRegexp.test(authors[j])) {
  645.                                 // ignore places where there are parentheses        
  646.                                 newItem.creators.push({lastName:authors[j], creatorType:"author", fieldMode:true});
  647.                             }
  648.                         }
  649.                     } else {
  650.                         newItem.creators.push(Zotero.Utilities.cleanString(match[2]));
  651.                     }
  652.                 } else if(match[1] == ''Publication'') {
  653.                     match[2] = Zotero.Utilities.cleanString(match[2]);
  654.                     if(match[2].substring(match[2].length-1) == '','') {
  655.                         match[2] = match[2].substring(0, match[2].length-1);
  656.                     }
  657.                     
  658.                     // most, but not all, WorldCat publisher/places are
  659.                     // colon delimited
  660.                     var parts = match[2].split(/ ?: ?/);
  661.                     if(parts.length == 2) {
  662.                         newItem.place = parts[0];
  663.                         newItem.publisher = parts[1];
  664.                     } else {
  665.                         newItem.publisher = match[2];
  666.                     }
  667.                 } else if(match[1] == ''Institution'') {
  668.                     newItem.publisher = match[2];
  669.                 } else if(match[1] == ''Standard No'') {
  670.                     var ISBNRe = /ISBN:\s*([0-9X]+)/
  671.                     var m = ISBNRe.exec(match[2]);
  672.                     if(m) newItem.ISBN = m[1];
  673.                 } else if(match[1] == ''Year'') {
  674.                     newItem.date = match[2];
  675.                 } else if(match[1] == "Descriptor") {
  676.                     if(match[2][match[2].length-1] == ".") {
  677.                         match[2] = match[2].substr(0, match[2].length-1);
  678.                     }
  679.                     
  680.                     var tags = match[2].split("--");
  681.                     for(var j in tags) {
  682.                         newItem.tags.push(Zotero.Utilities.cleanString(tags[j]));
  683.                     }
  684.                 } else if(match[1] == "Accession No") {
  685.                     newItem.accessionNumber = Zotero.Utilities.superCleanString(match[2]);
  686.                 } else if(match[1] == "Degree") {
  687.                     newItem.itemType = "thesis";
  688.                     newItem.thesisType = match[2];
  689.                 } else if(match[1] == "DOI") {
  690.                     newItem.DOI = match[2];
  691.                 } else if(match[1] == "Database") {
  692.                     if(match[2].substr(0, 8) != "WorldCat") {
  693.                         newItem.itemType = "journalArticle";
  694.                     }
  695.                 } else if(match[1] != "Availability" &&
  696.                           match[1] != "Find Items About" &&
  697.                           match[1] != "Document Type") {
  698.                     newItem.extra += match[1]+": "+match[2]+"\n";
  699.                 }
  700.             } else {
  701.                 if(lines[i] != "" && lines[i] != "SUBJECT(S)") {
  702.                     newMatch[2] += " "+lines[i];
  703.                 }
  704.             }
  705.         }
  706.         
  707.         if(newItem.extra) {
  708.             newItem.extra = newItem.extra.substr(0, newItem.extra.length-1);
  709.         }
  710.         
  711.         newItem.complete();
  712.         processURLs(urls);
  713.     }, false, ''iso-8859-1'');
  714. }
  715.  
  716. function doWeb(doc, url) {
  717.     var sessionRegexp = /(?:\?|\:)sessionid=([^?:]+)(?:\?|\:|$)/;
  718.     var numberRegexp = /(?:\?|\:)recno=([^?:]+)(?:\?|\:|$)/;
  719.     var resultsetRegexp = /(?:\?|\:)resultset=([^?:]+)(?:\?|\:|$)/;
  720.     var hostRegexp = new RegExp("^(https?://[^/]+)/");
  721.         
  722.     var sMatch = sessionRegexp.exec(url);
  723.     var sessionid = sMatch[1];
  724.     
  725.     var hMatch = hostRegexp.exec(url);
  726.     var host = hMatch[1];
  727.     
  728.     var newUri, exportselect;
  729.     
  730.     var detailRe = /FirstSearch: [\w ]+ Detailed Record/;
  731.     if(detailRe.test(doc.title)) {
  732.         var publisherRegexp = /^(.*), (.*?),?$/;
  733.         
  734.         var nMatch = numberRegexp.exec(url);
  735.         if(nMatch) {
  736.             var number = nMatch[1];
  737.         } else {
  738.             number = 1;
  739.         }
  740.         
  741.         var rMatch = resultsetRegexp.exec(url);
  742.         if(rMatch) {
  743.             var resultset = rMatch[1];
  744.         } else {
  745.             // It''s in an XPCNativeWrapper, so we have to do this black magic
  746.             resultset = doc.forms.namedItem(''main'').elements.namedItem(''resultset'').value;
  747.         }
  748.         
  749.         urls = [host+''/WebZ/DirectExport?numrecs=10:smartpage=directexport:entityexportnumrecs=10:entityexportresultset='' + resultset + '':entityexportrecno='' + number + '':sessionid='' + sessionid + '':entitypagenum=35:0''];
  750.     } else {
  751.         var items = Zotero.Utilities.getItemArray(doc, doc, ''/WebZ/FSFETCH\\?fetchtype=fullrecord'', ''^(See more details for locating this item|Detailed Record)$'');
  752.         items = Zotero.selectItems(items);
  753.         
  754.         if(!items) {
  755.             return true;
  756.         }
  757.         
  758.         var urls = new Array();
  759.         
  760.         for(var i in items) {
  761.             var nMatch = numberRegexp.exec(i);
  762.             var rMatch = resultsetRegexp.exec(i);
  763.             if(rMatch && nMatch) {
  764.                 var number = nMatch[1];
  765.                 var resultset = rMatch[1];
  766.                 urls.push(host+''/WebZ/DirectExport?numrecs=10:smartpage=directexport:entityexportnumrecs=10:entityexportresultset='' + resultset + '':entityexportrecno='' + number + '':sessionid='' + sessionid + '':entitypagenum=35:0'');
  767.             }
  768.         }
  769.     }
  770.     
  771.     processURLs(urls);
  772.     Zotero.wait();
  773. }');
  774.  
  775. REPLACE INTO translators VALUES ('a2363670-7040-4cb9-8c48-6b96584e92ee', '1.0.0b4r1', '', '2007-09-13 12:00:00', '0', '100', '4', 'Florida University Libraries (Endeca 1)', 'Sean Takats', '^http://[^/]+/[^\.]+.jsp\?Nt.=', 
  776. 'function detectWeb(doc, url){
  777.     var namespace = doc.documentElement.namespaceURI;
  778.     var nsResolver = namespace ? function(prefix) {
  779.         if (prefix == ''x'') return namespace; else return null;
  780.         } : null;
  781.         
  782.     var xpath = ''//div[starts-with(@id, "briefTitle")]'';
  783.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  784.         return "multiple";
  785.     }
  786.     if (url.indexOf("&V=D")){
  787.         return "book";
  788.     } else if (url.indexOf("&V=M")){
  789.         return "book";
  790.     } else if (url.indexOf("&V=U")){
  791.         return "book";
  792.     }
  793. }', 
  794. 'function doWeb(doc, url){
  795.     var newUris = new Array();
  796.     var namespace = doc.documentElement.namespaceURI;
  797.     var nsResolver = namespace ? function(prefix) {
  798.         if (prefix == ''x'') return namespace; else return null;
  799.         } : null;    
  800.     var xpath = ''//div[starts-with(@id, "briefTitle")]/a'';
  801.     var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  802.     var elmt;
  803.     if(elmt = elmts.iterateNext()) {
  804.         // search page
  805.         var items = new Array();
  806.         do {
  807.             items[elmt.href] = Zotero.Utilities.cleanString(elmt.textContent);
  808.             Zotero.debug(elmt.textContent);
  809.         } while (elmt = elmts.iterateNext());
  810.         
  811.         items = Zotero.selectItems(items);
  812.         if(!items) {
  813.             return true;
  814.         }
  815.         for(var i in items) {
  816.             var newUri = i.replace(/&V=./, "&V=M");
  817.             newUris.push(newUri);
  818.         }
  819.     } else {
  820.         // single page
  821.         var newURL = url.replace(/&V=./, "&V=M");
  822.         newUris.push(newURL);
  823.     }
  824.     var translator = Zotero.loadTranslator("import");
  825.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  826.     var marc = translator.getTranslatorObject();
  827.     Zotero.Utilities.processDocuments(newUris, function(newDoc) {
  828.         var uri = newDoc.location.href;
  829.         var xpath = ''//tr[@class="trGenContent"][td[3]]'';
  830.         var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null);
  831.         var elmt;
  832.         
  833.         var record = new marc.record();
  834.         while(elmt = elmts.iterateNext()) {
  835.             var field = Zotero.Utilities.superCleanString(doc.evaluate(''./TD[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  836.             var value = doc.evaluate(''./TD[3]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  837.             
  838.             if(field == "LDR") {
  839.                 record.leader = value;
  840.             } else if(field != "FMT") {
  841.                 
  842.                 Zotero.debug("field=" + field);
  843.                 value = value.replace(/\|([a-z]) /g, marc.subfieldDelimiter+"$1");
  844.                 
  845.                 var code = field.substring(0, 3);
  846.                 var ind = "";
  847.                 if(field.length > 3) {
  848.                     ind = field[3];
  849.                     if(field.length > 4) {
  850.                         ind += field[4];
  851.                     }
  852.                 }
  853.                 
  854.                 record.addField(code, ind, value);
  855.             }
  856.         }
  857.         
  858.         var newItem = new Zotero.Item();
  859.         record.translate(newItem);
  860.         
  861.         var domain = url.match(/https?:\/\/([^/]+)/);
  862.         newItem.repository = domain[1]+" Library Catalog";
  863.         
  864.         newItem.complete();
  865.     }, function() { Zotero.done(); }, null);
  866.     Zotero.wait();    
  867. }');
  868.  
  869. REPLACE INTO translators VALUES ('da440efe-646c-4a18-9958-abe1f7d55cde', '1.0.0b4r1', '', '2007-09-13 12:00:00', '0', '100', '4', 'NCSU Library (Endeca 2)', 'Sean Takats', '^https?://[^\.]+.lib.ncsu.edu/(?:web2/tramp2\.exe|catalog/\?)', 
  870. 'function detectWeb(doc, url) { 
  871.     var namespace = doc.documentElement.namespaceURI;
  872.     var nsResolver = namespace ? function(prefix) {
  873.         if (prefix == ''x'') return namespace; else return null;
  874.     } : null;
  875.     var xpath = ''//a[contains(text(), "MARC record")]'';
  876.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  877.         return "book";
  878.     }
  879.     xpath = ''//span[@class="resultTitle"]/a'';
  880.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  881.         return "multiple";
  882.     }
  883. }', 
  884. 'function scrape(text){
  885.     var tempidRe = new RegExp("/web2/tramp2\.exe/goto/([^?]+)\?");
  886.     var tempidMatch = tempidRe.exec(text);
  887.     var tempid = tempidMatch[1];
  888.     
  889.     marcUri = "http://catalog.lib.ncsu.edu/web2/tramp2.exe/download_hitlist/" + tempid;
  890.     marcUri = marcUri + "/NCSUCatResults.mrc?server=1home&format=MARC&server=1home&item=1&item_source=1home";
  891.     Zotero.Utilities.HTTP.doGet(marcUri, function(text) {
  892.         // load translator for MARC
  893.         var marc = Zotero.loadTranslator("import");
  894.         marc.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  895.         marc.setString(text);    
  896.         marc.translate();
  897.     }, function() {Zotero.done()}, null);
  898. }
  899.  
  900. function doWeb(doc, url) { 
  901.     var namespace = doc.documentElement.namespaceURI;
  902.     var nsResolver = namespace ? function(prefix) {
  903.         if (prefix == ''x'') return namespace; else return null;
  904.     } : null;
  905.     
  906.     var xpath = ''//span[@class="resultTitle"]/a'';
  907.     var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  908.     var elmt;
  909.     if(elmt = elmts.iterateNext()) {
  910.         // search results page
  911.         var newUris = new Array();
  912.         var items = new Array();
  913.         do {
  914.             items[elmt.href] = Zotero.Utilities.cleanString(elmt.textContent);
  915.         } while (elmt = elmts.iterateNext());
  916.         items = Zotero.selectItems(items);
  917.         if(!items) {
  918.             return true;
  919.         }
  920.         for(var i in items) {
  921.             newUris.push(i);
  922.         }
  923.         Zotero.Utilities.HTTP.doGet(newUris, function(text) { scrape(text) },
  924.             function() {}, null);        
  925.         Zotero.wait();
  926.     } else if (elmt = doc.evaluate(''//a[contains(text(), "MARC record")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  927.         // single book
  928.         scrape(elmt.href);
  929.         Zotero.wait();
  930.     }
  931. }');
  932.  
  933. REPLACE INTO translators VALUES ('88915634-1af6-c134-0171-56fd198235ed', '1.0.0b3.r1', '', '2008-01-30 07:30:00', '1', '100', '4', 'Library Catalog (Voyager)', 'Simon Kornblith', 'Pwebrecon\.cgi', 
  934. 'function detectWeb(doc, url) {
  935.     var export_options = doc.forms.namedItem(''frm'').elements.namedItem(''RD'').options;
  936.     for(var i in export_options) {
  937.         if(export_options[i].text == ''Latin1 MARC''
  938.         || export_options[i].text == ''Raw MARC''
  939.         || export_options[i].text == ''MARC 8''
  940.         || export_options[i].text == ''UTF-8''
  941.         || export_options[i].text == ''MARC (Unicode/UTF-8)''
  942.         || export_options[i].text == ''MARC UTF-8''
  943.         || export_options[i].text == ''UTF-8 MARC (Unicode)''
  944.         || export_options[i].text == ''UTF8-Unicode''
  945.         || export_options[i].text == ''MARC (non-Unicode/MARC-8)'') {
  946.             // We have an exportable single record
  947.             if(doc.forms.namedItem(''frm'').elements.namedItem(''RC'')) {
  948.                 return "multiple";
  949.             } else {
  950.                 return "book";
  951.             }
  952.         }
  953.     }
  954. }', 
  955. 'function doWeb(doc, url) {
  956.     var postString = '''';
  957.     var form = doc.forms.namedItem(''frm'');
  958.     var newUri = form.action;
  959.     var multiple = false;
  960.     
  961.     if(doc.forms.namedItem(''frm'').elements.namedItem(''RC'')) {
  962.         multiple = true;
  963.         
  964.         var availableItems = new Object();    // Technically, associative arrays are objects
  965.             
  966.         var namespace = doc.documentElement.namespaceURI;
  967.         var nsResolver = namespace ? function(prefix) {
  968.             if (prefix == ''x'') return namespace; else return null;
  969.         } : null;
  970.         
  971.         // Require link to match this
  972.         var tagRegexp = new RegExp();
  973.         tagRegexp.compile(''Pwebrecon\\.cgi\\?.*v1=[0-9]+\\&.*ti='');
  974.         // Do not allow text to match this
  975.         var rejectRegexp = new RegExp();
  976.         rejectRegexp.compile(''\[ [0-9]+ \]'');
  977.         
  978.         var checkboxes = new Array();
  979.         var urls = new Array();
  980.         
  981.         var tableRows = doc.evaluate(''//form[@name="frm"]//table/tbody/tr[td/input[@type="checkbox"]]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  982.  
  983.         // Go through table rows
  984.         var tableRow;
  985.         var i = 0;
  986.         while(tableRow = tableRows.iterateNext()) {
  987.             i++;
  988.             // CHK is what we need to get it all as one file
  989.             var input = doc.evaluate(''./td/input[@name="CHK"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  990.             checkboxes[i] = input.value;
  991.             var links = tableRow.getElementsByTagName("a");
  992.             // Go through links
  993.             for(var j=0; j<links.length; j++) {
  994.                 if(tagRegexp.test(links[j].href)) {
  995.                     var text = links[j].textContent;
  996.                     if(text) {
  997.                         text = Zotero.Utilities.cleanString(text);
  998.                         if(!rejectRegexp.test(text)) {
  999.                             if(availableItems[i]) {
  1000.                                 availableItems[i] += " "+text;
  1001.                             } else {
  1002.                                 availableItems[i] = text;
  1003.                             }
  1004.                         }
  1005.                     }
  1006.                 }
  1007.             }
  1008.             // if no title, pull from second td
  1009.             if(!availableItems[i]) {
  1010.                 availableItems[i] = Zotero.Utilities.cleanString(doc.evaluate(''./td[2]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  1011.             }
  1012.         }
  1013.         
  1014.         var items = Zotero.selectItems(availableItems);
  1015.         if(!items) {
  1016.             return true;
  1017.         }
  1018.         
  1019.         // add arguments for items we need to grab
  1020.         for(var i in items) {
  1021.             postString += "CHK="+checkboxes[i]+"&";
  1022.         }
  1023.     }
  1024.     
  1025.     var raw, unicode, latin1;
  1026.     
  1027.     for(var i=0; i<form.elements.length; i++) {
  1028.         if(form.elements[i].type && form.elements[i].type.toLowerCase() == ''hidden'') {
  1029.             postString += escape(form.elements[i].name)+''=''+escape(form.elements[i].value)+''&'';
  1030.         }
  1031.     }
  1032.     
  1033.     var export_options = form.elements.namedItem(''RD'').options;
  1034.     for(var i=0; i<export_options.length; i++) {
  1035.         if(export_options[i].text == ''Raw MARC''
  1036.         || export_options[i].text == ''MARC 8''
  1037.         || export_options[i].text == ''MARC (non-Unicode/MARC-8)'') {
  1038.             raw = i;
  1039.         }  if(export_options[i].text == ''Latin1 MARC'') {
  1040.             latin1 = i;
  1041.         } else if(export_options[i].text == ''UTF-8''
  1042.         || export_options[i].text == ''UTF-8 MARC (Unicode)''
  1043.         || export_options[i].text == ''UTF8-Unicode''
  1044.         || export_options[i].text == ''MARC UTF-8''
  1045.         || export_options[i].text == ''MARC (Unicode/UTF-8)'') {
  1046.             unicode = i;
  1047.         }
  1048.     }
  1049.     
  1050.     if(unicode) {
  1051.         var rd = unicode;
  1052.     } else if(latin1) {
  1053.         var rd = latin1;
  1054.     } else if(raw) {
  1055.         var rd = raw;
  1056.     } else {
  1057.         return false;
  1058.     }
  1059.     
  1060.     postString += ''RD=''+rd+''&MAILADDY=&SAVE=Press+to+SAVE+or+PRINT'';
  1061.     
  1062.     // No idea why this doesn''t work as post
  1063.     Zotero.Utilities.HTTP.doGet(newUri+''?''+postString, function(text) {
  1064.         // load translator for MARC
  1065.         var marc = Zotero.loadTranslator("import");
  1066.         marc.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  1067.         marc.setString(text);
  1068.         
  1069.         // if this is the LOC catalog, specify that in repository field
  1070.         if(url.length > 23 && url.substr(0, 23) == "http://catalog.loc.gov/") {
  1071.             marc.setHandler("itemDone", function(obj, item) {
  1072.                 item.repository = "Library of Congress Catalog";
  1073.                 item.complete();
  1074.             });
  1075.         } else {
  1076.             var domain = url.match(/https?:\/\/([^/]+)/);
  1077.             marc.setHandler("itemDone", function(obj, item) {
  1078.                 item.repository = domain[1]+" Library Catalog";
  1079.                 item.complete();
  1080.             });
  1081.         }
  1082.         
  1083.         marc.translate();
  1084.         
  1085.         Zotero.done();
  1086.     })
  1087.     Zotero.wait();
  1088. }');
  1089.  
  1090. REPLACE INTO translators VALUES ('d921155f-0186-1684-615c-ca57682ced9b', '1.0.0b4.r1', '', '2008-01-09 20:00:00', '1', '100', '4', 'JSTOR', 'Simon Kornblith', 'https?://[^/]*jstor\.org[^/]*/(?:view|browse/[^/]+/[^/]+\?|search/|cgi-bin/jstor/viewitem)', 
  1091. 'function detectWeb(doc, url) {
  1092.     var namespace = doc.documentElement.namespaceURI;
  1093.     var nsResolver = namespace ? function(prefix) {
  1094.         if (prefix == ''x'') return namespace; else return null;
  1095.     } : null;
  1096.     
  1097.     // See if this is a seach results page
  1098.     if(doc.title == "JSTOR: Search Results" || url.indexOf("/browse/") != -1) {
  1099.         return "multiple";
  1100.     } else if(url.indexOf("/search/") != -1) {
  1101.         return false;
  1102.     }
  1103.     
  1104.     // If this is a view page, find the link to the citation
  1105.     var xpath = ''/html/body/div[@class="indent"]//a[@class="nav"]'';
  1106.     var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  1107.     if(elmts.iterateNext()) {
  1108.         return "journalArticle";
  1109.     }
  1110. }', 
  1111. 'function getJSTORAttachment(viewURL) {
  1112.     var viewRe = new RegExp("(^https?://[^/]+/)view([^?]+)");
  1113.     var m = viewRe.exec(viewURL);
  1114.     if(m) {
  1115.         return {url:m[1]+"cgi-bin/jstor/printpage"+m[2]+".pdf?dowhat=Acrobat",
  1116.                 mimeType:"application/pdf", title:"JSTOR Full Text PDF"};
  1117.     } else {
  1118.         return false;
  1119.     }
  1120. }
  1121.  
  1122. function itemComplete(newItem, url) {
  1123.     if(newItem.url) {
  1124.         newItem.attachments.push({url:newItem.url, mimeType:"text/html",
  1125.                                   title:"JSTOR Link", snapshot:false});
  1126.     } else {
  1127.         if(newItem.ISSN) {
  1128.             newItem.url = "http://www.jstor.org/browse/"+newItem.ISSN;
  1129.         } else {
  1130.             newItem.url = url;
  1131.         }
  1132.     }
  1133.     
  1134.     newItem.complete();
  1135. }
  1136.  
  1137. function doWeb(doc, url) {
  1138.     var namespace = doc.documentElement.namespaceURI;
  1139.     var nsResolver = namespace ? function(prefix) {
  1140.         if (prefix == ''x'') return namespace; else return null;
  1141.     } : null;
  1142.     var saveCitations = new Array();
  1143.     var viewPages = new Array();
  1144.     
  1145.     var hostRegexp = new RegExp("^(https?://[^/]+)/");
  1146.     var hMatch = hostRegexp.exec(url);
  1147.     var host = hMatch[1];
  1148.     
  1149.     if(doc.title == "JSTOR: Search Results") {
  1150.         var availableItems = new Object();
  1151.         
  1152.         // Require link to match this
  1153.         var tagRegexp = new RegExp();
  1154.         tagRegexp.compile(''citationAction='');
  1155.         
  1156.         var tableRows = doc.evaluate(''//tr[td/span[@class="printDownloadSaveLinks"]]'', doc, nsResolver, XPathResult.ANY_TYPE, null);        
  1157.         var tableRow;
  1158.         // Go through table rows
  1159.         var tableView = new Array();
  1160.         var tableSave = new Array();
  1161.         var i = 0;
  1162.         while(tableRow = tableRows.iterateNext()) {
  1163.             i++;
  1164.             var links = tableRow.getElementsByTagName("a");
  1165.             // Go through links
  1166.             for(var j=0; j<links.length; j++) {
  1167.                 if(links[j].href.indexOf("citationAction=") != -1) {
  1168.                     tableSave[i] = links[j].href;
  1169.                     var link = doc.evaluate(''.//a[strong]'', tableRow, null, XPathResult.ANY_TYPE, null).iterateNext();
  1170.                     if(link) {
  1171.                         tableView[i] = link.href;
  1172.                     }
  1173.                     
  1174.                     var text = doc.evaluate(''.//strong/text()'', tableRow, null, XPathResult.ANY_TYPE, null).iterateNext();
  1175.                     if(text && text.nodeValue) {
  1176.                         text = Zotero.Utilities.trimInternal(text.nodeValue);
  1177.                         if(availableItems[i]) {
  1178.                             availableItems[i] += " "+text;
  1179.                         } else {
  1180.                             availableItems[i] = text;
  1181.                         }
  1182.                     }
  1183.                 }
  1184.             }
  1185.         }
  1186.         
  1187.         var items = Zotero.selectItems(availableItems);
  1188.         if(!items) {
  1189.             return true;
  1190.         }
  1191.         
  1192.         for(var i in items) {
  1193.             viewPages.push(tableView[i]);
  1194.             saveCitations.push(tableSave[i].replace(''citationAction=remove'', ''citationAction=save''));
  1195.         }
  1196.     } else if(url.indexOf("/browse/") != -1) {
  1197.         var tableView = new Object();
  1198.         var items = new Object();
  1199.         
  1200.         var articleTitle, viewPage;
  1201.         var links = doc.evaluate("//a", doc, nsResolver, XPathResult.ANY_TYPE, null);
  1202.         var link;
  1203.         // get article and save citation links
  1204.         while(link = links.iterateNext()) {
  1205.             if(link.href.indexOf("/view/") != -1) {
  1206.                 articleTitle = link.textContent;
  1207.                 viewPage = link.href;
  1208.             } else if(link.href.indexOf("citationAction=save&") != -1) {
  1209.                 items[link.href] = articleTitle;
  1210.                 tableView[link.href] = viewPage;
  1211.             }
  1212.         }
  1213.         
  1214.         var items = Zotero.selectItems(items);
  1215.         if(!items) return true;
  1216.         
  1217.         for(var i in items) {
  1218.             viewPages.push(tableView[i]);
  1219.             saveCitations.push(i.replace(''citationAction=remove'', ''citationAction=save''));
  1220.         }
  1221.     } else {
  1222.         // If this is a view page, find the link to the citation
  1223.         var xpath = ''/html/body/div[@class="indent"]//a[@class="nav"]'';
  1224.         var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  1225.         var saveCitation = elmts.iterateNext();
  1226.         var viewSavedCitations = elmts.iterateNext();
  1227.         
  1228.         if(saveCitation && viewSavedCitations) {
  1229.             viewPages.push(url);
  1230.             saveCitations.push(saveCitation.href.replace(''citationAction=remove'', ''citationAction=save''));
  1231.         } else {
  1232.             throw("Could not find citation save links");
  1233.         }
  1234.     }
  1235.     
  1236.     Zotero.Utilities.HTTP.doGet(host+''/browse?citationAction=removeAll&confirmRemAll=on&viewCitations=1'', function() {    // clear marked
  1237.         // Mark all our citations
  1238.         Zotero.Utilities.HTTP.doGet(saveCitations, null, function() {                        // mark this
  1239.             Zotero.Utilities.HTTP.doGet(host+''/browse/citations.txt?exportAction=Save+as+Text+File&exportFormat=cm&viewCitations=1'', function(text) {
  1240.                                                                                             // get marked
  1241.                 var k = 0;
  1242.                 var lines = text.split("\n");
  1243.                 var haveStarted = false;
  1244.                 var newItemRe = /^<[0-9]+>/;
  1245.                 
  1246.                 var newItem = new Zotero.Item("journalArticle");
  1247.                 newItem.attachments.push(getJSTORAttachment(viewPages[k]));
  1248.                 
  1249.                 for(var i in lines) {
  1250.                     if(lines[i].substring(0,3) == "<1>") {
  1251.                         haveStarted = true;
  1252.                     } else if(newItemRe.test(lines[i])) {
  1253.                         itemComplete(newItem, url);
  1254.                         k++;
  1255.                         
  1256.                         newItem = new Zotero.Item("journalArticle");
  1257.                         newItem.attachments.push(getJSTORAttachment(viewPages[k]));
  1258.                     } else if(lines[i].substring(2, 5) == " : " && haveStarted) {
  1259.                         var fieldCode = lines[i].substring(0, 2);
  1260.                         var fieldContent = Zotero.Utilities.cleanString(lines[i].substring(5))
  1261.                         
  1262.                         if(fieldCode == "TI") {
  1263.                             if(fieldContent) {
  1264.                                 newItem.title = fieldContent;
  1265.                             } else {
  1266.                                 newItem.title = "[untitled]";
  1267.                             }
  1268.                         } else if(fieldCode == "AU") {
  1269.                             var authors = fieldContent.split(";");
  1270.                             for(j in authors) {
  1271.                                 if(authors[j]) {
  1272.                                     newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j], "author", true));
  1273.                                 }
  1274.                             }
  1275.                         } else if(fieldCode == "SO") {
  1276.                             newItem.publicationTitle = fieldContent;
  1277.                         } else if(fieldCode == "VO") {
  1278.                             newItem.volume = fieldContent;
  1279.                         } else if(fieldCode == "NO") {
  1280.                             newItem.issue = fieldContent;
  1281.                         } else if(fieldCode == "SE") {
  1282.                             newItem.series = fieldContent;
  1283.                         } else if(fieldCode == "DA") {
  1284.                             newItem.date = fieldContent;
  1285.                         } else if(fieldCode == "PP") {
  1286.                             newItem.pages = fieldContent;
  1287.                         } else if(fieldCode == "EI") {
  1288.                             newItem.url = fieldContent;
  1289.                         } else if(fieldCode == "IN") {
  1290.                             newItem.ISSN = fieldContent;
  1291.                         } else if(fieldCode == "PB") {
  1292.                             newItem.publisher = fieldContent;
  1293.                         } else if(fieldCode == "AB") {
  1294.                             newItem.abstractNote = fieldContent;
  1295.                         }
  1296.                     }
  1297.                 }
  1298.                 
  1299.                 // last item is complete
  1300.                 if(haveStarted) {
  1301.                     itemComplete(newItem, url);
  1302.                 }
  1303.                 
  1304.                 Zotero.Utilities.HTTP.doGet(host+''/browse?citationAction=removeAll&confirmRemAll=on&viewCitations=1'', function() {    // clear marked
  1305.                     Zotero.done();
  1306.                 });
  1307.             });
  1308.         });
  1309.     });
  1310.     
  1311.     Zotero.wait();
  1312. }');
  1313.  
  1314. REPLACE INTO translators VALUES ('e85a3134-8c1a-8644-6926-584c8565f23e', '1.0.0b4.r1', '', '2008-01-13 19:30:00', '1', '100', '4', 'History Cooperative', 'Simon Kornblith', 'https?://[^/]*historycooperative\.org[^/]*/(?:journals/.+/.+/.+\.s?html$|cgi-bin/search.cgi|journals/.+/.+/)', 
  1315. 'function detectWeb(doc, url) {
  1316.     var contents = doc.title.replace("Contents", "");
  1317.     if(doc.title != contents || doc.title == "History Cooperative: Search Results") {
  1318.         return "multiple";
  1319.     } else {
  1320.         return "journalArticle";
  1321.     }
  1322. }', 
  1323. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  1324.     var field = metaTags.namedItem(field);
  1325.     if(field) {
  1326.         newItem[zoteroField] = field.getAttribute("content");
  1327.     }
  1328. }
  1329.  
  1330. function scrape(doc) {
  1331.     var newItem = new Zotero.Item("journalArticle");
  1332.     newItem.url = doc.location.href;
  1333.     
  1334.     var month, year;
  1335.     var metaTags = doc.getElementsByTagName("meta");
  1336.     
  1337.     // grab title without using meta tag, since when titles have quotes History
  1338.     // Cooperative can''t create a proper meta tag
  1339.     var titleRe = /<!--_title_-->(.*)<!--_\/title_-->/;
  1340.     var m = titleRe.exec(doc.getElementsByTagName("body")[0].innerHTML);
  1341.     if(m) {
  1342.         newItem.title = m[1];
  1343.     } else {
  1344.         var namespace = doc.documentElement.namespaceURI;
  1345.         var nsResolver = namespace ? function(prefix) {
  1346.             if (prefix == ''x'') return namespace; else return null;
  1347.         } : null;
  1348.     
  1349.         var bookTitle = doc.evaluate(''/html/body/form/table/tbody/tr/td[3]/table/tbody/tr/td/i'',
  1350.             doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();    
  1351.         bookTitle = bookTitle.textContent;
  1352.         newItem.title = "Review of "+bookTitle;
  1353.     }
  1354.     
  1355.     associateMeta(newItem, metaTags, "Journal", "publicationTitle");
  1356.     associateMeta(newItem, metaTags, "Volume", "volume");
  1357.     associateMeta(newItem, metaTags, "Issue", "issue");
  1358.     
  1359.     var author = metaTags.namedItem("Author");
  1360.     if(author) {
  1361.         var authors = author.getAttribute("content").split(" and ");
  1362.         for(j in authors) {
  1363.             authors[j] = authors[j].replace("Reviewed by ", "");
  1364.             newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j], "author"));
  1365.         }
  1366.     }
  1367.     
  1368.     var month = metaTags.namedItem("PublicationMonth");
  1369.     var year = metaTags.namedItem("PublicationYear");
  1370.     if(month && year) {
  1371.         newItem.date = month.getAttribute("content")+" "+year.getAttribute("content");
  1372.     }
  1373.     
  1374.     newItem.attachments.push({document:doc, title:"History Cooperative Snapshot"});
  1375.     
  1376.     newItem.complete();
  1377. }
  1378.  
  1379. function doWeb(doc, url) {
  1380.     var contents = doc.title.replace(" Contents | ", "");
  1381.     if(doc.title != contents || doc.title == "History Cooperative: Search Results") {
  1382.         var items = Zotero.Utilities.getItemArray(doc, doc, ''^https?://[^/]+/journals/.+/.+/.+\.html$'');
  1383.         items = Zotero.selectItems(items);
  1384.         
  1385.         if(!items) {
  1386.             return true;
  1387.         }
  1388.         
  1389.         var uris = new Array();
  1390.         for(var i in items) {
  1391.             uris.push(i);
  1392.         }
  1393.         
  1394.         Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) },
  1395.             function() { Zotero.done(); }, null);
  1396.         
  1397.         Zotero.wait();
  1398.     } else {
  1399.         scrape(doc);
  1400.     }
  1401. }');
  1402.  
  1403. REPLACE INTO translators VALUES ('7987b420-e8cb-4bea-8ef7-61c2377cd686', '1.0.0b4.r1', '', '2007-06-27 02:00:00', '0', '100', '4', 'NASA ADS', 'Asa Kusuma and Ramesh Srigiriraju', '^http://adsabs\.harvard\.edu/(?:cgi-bin|abs)/', 
  1404. 'function detectWeb(doc, url) {
  1405.     var namespace = doc.documentElement.namespaceURI;
  1406.     var nsResolver = namespace ? function(prefix) {
  1407.         if (prefix == ''x'') return namespace; else return null;
  1408.     } : null;
  1409.     
  1410.     var singXpath = ''//input[@name="bibcode"][@type="hidden"]'';
  1411.     var multXpath = ''//input[@name="bibcode"][@type="checkbox"]'';
  1412.  
  1413.     if (doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  1414.         return "multiple";
  1415.     } else if (doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  1416.         return "journalArticle";
  1417.     }
  1418. }', 
  1419. 'function parseRIS(bibcodes){
  1420.     var getURL = "http://adsabs.harvard.edu/cgi-bin/nph-bib_query?"
  1421.         + bibcodes + "data_type=REFMAN&nocookieset=1";
  1422.     Zotero.Utilities.HTTP.doGet(getURL, function(text){    
  1423.         // load translator for RIS
  1424.         var translator = Zotero.loadTranslator("import");
  1425.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  1426.         translator.setString(text);
  1427.         translator.translate();
  1428.         Zotero.done();
  1429.     }, function() {});
  1430.     Zotero.wait();
  1431. }
  1432.  
  1433. function doWeb(doc, url) {
  1434.     var namespace = doc.documentElement.namespaceURI;
  1435.     var nsResolver = namespace ? function(prefix) {
  1436.         if (prefix == ''x'') return namespace; else return null;
  1437.     } : null;
  1438.  
  1439.     var singXpath = ''//input[@name="bibcode"][@type="hidden"]'';
  1440.     var multXpath = ''//input[@name="bibcode"][@type="checkbox"]'';
  1441.     var titleXpath = ''//table/tbody/tr/td[4]''; //will find scores and titles
  1442.  
  1443.     var bibElmts = doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  1444.     var titleElmts = doc.evaluate(titleXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  1445.     var titleElmt;
  1446.     var bibElmt;
  1447.  
  1448.     if ((bibElmt = bibElmts.iterateNext()) && (titleElmt = titleElmts.iterateNext())) {
  1449.  
  1450.         var items = new Array();
  1451.  
  1452.         do {
  1453.             titleElmt = titleElmts.iterateNext(); //iterate a second time to avoid score
  1454.             items[bibElmt.value] = Zotero.Utilities.cleanString(titleElmt.textContent);
  1455.         } while((bibElmt = bibElmts.iterateNext()) && (titleElmt = titleElmts.iterateNext()));
  1456.  
  1457.         items = Zotero.selectItems(items);
  1458.         if(!items) return true;
  1459.  
  1460.         var bibcodes="";
  1461.         for(var bibcode in items) {
  1462.             bibcodes = bibcodes + "bibcode="+encodeURIComponent(bibcode) + "&";
  1463.         }
  1464.         parseRIS(bibcodes);        
  1465.                 
  1466.     } else if (bibElmt = doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  1467.         var bibcode = bibElmt.value;
  1468.         var bibcodes = "bibcode="+encodeURIComponent(bibcode) + "&";
  1469.         parseRIS(bibcodes);
  1470.     }
  1471. }');
  1472.  
  1473. REPLACE INTO translators VALUES ('99f958ab-0732-483d-833f-6bd8e42f6277', '1.0.0b4.r1', '', '2007-06-27 02:00:00', '0', '100', '4', 'National Bureau of Economic Research', 'Asa Kusuma', '^https?://(?:papers\.|www\.)?nber\.org/papers', 
  1474. 'function detectWeb(doc, url) {
  1475.     var namespace = doc.documentElement.namespaceURI;
  1476.     var nsResolver = namespace ? function(prefix) {
  1477.         if (prefix == ''x'') return namespace; else return null;
  1478.     } : null;
  1479.     
  1480.     var singXpath = ''//h1[@class="title"]'';
  1481.     var multXpath = ''//input[@name="module"][@type="hidden"]'';
  1482.     var singleXpath = ''//input[@name="domains"][@type="hidden"]'';
  1483.     
  1484.     var str=doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  1485.  
  1486.     if (doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  1487.         return "multiple";
  1488.     } else if (url.indexOf("byprog")==-1 && doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.indexOf("Working Paper Search Results")==-1){
  1489.         
  1490.         if(doc.evaluate(singleXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() && doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.indexOf("NBER Working Papers")==-1) {
  1491.             return "journalArticle";
  1492.         }
  1493.     }
  1494. }', 
  1495. 'function parseRIS(uris){
  1496.     
  1497.     Zotero.Utilities.HTTP.doGet(uris, function(text){    
  1498.         // load translator for RIS
  1499.         var translator = Zotero.loadTranslator("import");
  1500.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  1501.         translator.setString(text);
  1502.         translator.translate();
  1503.         Zotero.done();
  1504.     }, function() {});
  1505.     Zotero.wait();
  1506. }
  1507.  
  1508. function doWeb(doc, url) {
  1509.     var namespace = doc.documentElement.namespaceURI;
  1510.     var nsResolver = namespace ? function(prefix) {
  1511.         if (prefix == ''x'') return namespace; else return null;
  1512.     } : null;
  1513.     
  1514.     var singXpath = ''//h1[@class="title"]'';
  1515.     var multXpath = ''//input[@name="module"]'';
  1516.     var str=doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  1517.  
  1518.     if (doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  1519.         
  1520.         var bibXpath=''//table/tbody/tr/td/nobr/b'';
  1521.         var titleXpath=''//table/tbody/tr/td/a'';
  1522.         
  1523.         var bibElmts = doc.evaluate(bibXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  1524.         var titleElmts = doc.evaluate(titleXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  1525.         var titleElmt;
  1526.         var bibElmt;
  1527.         bibElmt = bibElmts.iterateNext();
  1528.         titleElmt = titleElmts.iterateNext();
  1529.         
  1530.         var items = new Array();
  1531.  
  1532.         do {
  1533.             items[bibElmt.textContent] = Zotero.Utilities.cleanString(titleElmt.textContent);
  1534.         } while((bibElmt = bibElmts.iterateNext()) && (titleElmt = titleElmts.iterateNext()));
  1535.  
  1536.         items = Zotero.selectItems(items);
  1537.         if(!items) return true;
  1538.  
  1539.         var bibcodes="";
  1540.         var uris = new Array();
  1541.         for(var bibcode in items) {
  1542.             var getURL = "http://www.nber.org/papers/"
  1543.                 + bibcode + ".ris";
  1544.             uris.push(getURL);
  1545.         }
  1546.         
  1547.         parseRIS(uris);
  1548.  
  1549.  
  1550.     } else if (doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.indexOf("Working Paper Search Results")==-1){
  1551.         bibcode=url.substr(url.indexOf("/papers/")+8,url.length);
  1552.         var uris = new Array();
  1553.         var getURL = "http://www.nber.org/papers/"
  1554.             + bibcode + ".ris";
  1555.         uris.push(getURL);
  1556.         parseRIS(uris);
  1557.     }
  1558. }');
  1559.  
  1560. REPLACE INTO translators VALUES ('411f9a8b-64f3-4465-b7df-a3c988b602f3', '1.0.0b4.r1', '', '2007-06-26 15:17:22', '0', '100', '4', 'RePEc', 'Asa Kusuma', '^https?://ideas\.repec\.org/', 
  1561. 'function detectWeb(doc, url) {
  1562.     var namespace = doc.documentElement.namespaceURI;
  1563.     var nsResolver = namespace ? function(prefix) {
  1564.         if (prefix == ''x'') return namespace; else return null;
  1565.     } : null;
  1566.     
  1567.     var singXpath = ''//html/body/a/table/tbody/tr/td/font/b'';
  1568.     var multXpath = ''//html/body/h2'';
  1569.     
  1570.     
  1571.     
  1572.     if (doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  1573.         if(doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.indexOf("Search")!=-1)
  1574.             return "multiple";
  1575.     } else if(doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  1576.         return "journalArticle";
  1577.     }
  1578. }', 
  1579. 'function strrev(str) {
  1580.    if (!str) return '''';
  1581.    var revstr='''';
  1582.    for (i = str.length-1; i>=0; i--)
  1583.        revstr+=str.charAt(i)
  1584.    return revstr;
  1585. }
  1586.  
  1587.  
  1588. function parseRIS(uris) {
  1589.     
  1590.  
  1591.     Zotero.Utilities.HTTP.doGet(uris, function(text){    
  1592.         // load translator for RIS
  1593.         var translator = Zotero.loadTranslator("import");
  1594.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  1595.         translator.setString(text);
  1596.         translator.translate();
  1597.         Zotero.done();
  1598.     }, function() {});
  1599.     Zotero.wait();
  1600. }
  1601.  
  1602. function doWeb(doc, url) {
  1603.     
  1604.     
  1605.     
  1606.     var namespace = doc.documentElement.namespaceURI;
  1607.     var nsResolver = namespace ? function(prefix) {
  1608.         if (prefix == ''x'') return namespace; else return null;
  1609.     } : null;
  1610.     
  1611.     var singXpath = ''//html/body/a/table/tbody/tr/td/font/b'';
  1612.     var multXpath = ''//html/body/h2'';
  1613.     
  1614.     
  1615.  
  1616.     if (doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  1617.         if(doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.indexOf("Search")!=-1)
  1618.             
  1619.  
  1620.             shortXpath = ''//html/body/strong/a'';
  1621.             longXpath = ''//html/body/dl/dt/strong/a'';
  1622.             var multXpath='''';
  1623.             if(doc.evaluate(shortXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  1624.                 multXpath=shortXpath;
  1625.  
  1626.             } else {
  1627.                 multXpath=longXpath;
  1628.  
  1629.             }
  1630.             
  1631.             
  1632.             var bibElmts = doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  1633.             var titleElmts = doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  1634.             var titleElmt;
  1635.             var bibElmt;
  1636.             bibElmt = bibElmts.iterateNext();
  1637.             titleElmt = titleElmts.iterateNext();
  1638.  
  1639.             var items = new Array();
  1640.  
  1641.             do {
  1642.                 
  1643.                 var bibcode = bibElmt.href;
  1644.  
  1645.                 bibcode=bibcode.substr(24);
  1646.  
  1647.                 bibcode=strrev(bibcode);
  1648.                 bibcode=bibcode.substr(5,bibcode.length);
  1649.                 bibcode=strrev(bibcode);
  1650.                 
  1651.                 //Replace slashes with colons
  1652.                 bibcode=bibcode.replace("/",":","g");
  1653.                 
  1654.                 //Insert colons between numbers and letters and letters and numbers
  1655.                 bibcode=bibcode.replace(/([A-Za-z])([0-9])/g,
  1656.                            function (str, p1, p2, offset, s) {
  1657.                                   return p1 + ":" + p2;
  1658.                            }
  1659.                         )
  1660.  
  1661.                 bibcode=bibcode.replace(/([0-9])([A-Za-z])/g,
  1662.                            function (str, p1, p2, offset, s) {
  1663.                                   return p1 + ":" + p2;
  1664.                            }
  1665.                         )
  1666.                 
  1667.                 items[bibcode] = Zotero.Utilities.cleanString(titleElmt.textContent);
  1668.  
  1669.             } while((bibElmt = bibElmts.iterateNext()) && (titleElmt = titleElmts.iterateNext()));
  1670.  
  1671.             items = Zotero.selectItems(items);
  1672.             if(!items) return true;
  1673.  
  1674.             var bibcodes="";
  1675.             var uris = new Array();
  1676.             for(var bibcode in items) {                
  1677.  
  1678.                 var getURL = "http://ideas.repec.org/cgi-bin/ref.cgi?handle=RePEc";
  1679.                 getURL = getURL + bibcode + "&output=3";
  1680.  
  1681.                 uris.push(getURL);
  1682.             }
  1683.  
  1684.             parseRIS(uris);
  1685.             
  1686.             
  1687.             
  1688.             
  1689.     } else if(doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  1690.  
  1691.         var bibcode = url;
  1692.  
  1693.         bibcode=bibcode.substr(24);
  1694.  
  1695.         bibcode=strrev(bibcode);
  1696.         bibcode=bibcode.substr(5,bibcode.length);
  1697.         bibcode=strrev(bibcode);
  1698.         
  1699.  
  1700.         //Replace slashes with colons
  1701.         bibcode=bibcode.replace("/",":","g");
  1702.                 
  1703.         //Insert colons between numbers and letters and letters and numbers
  1704.         bibcode=bibcode.replace(/([A-Za-z])([0-9])/g,
  1705.                    function (str, p1, p2, offset, s) {
  1706.                           return p1 + ":" + p2;
  1707.                    }
  1708.                 )
  1709.  
  1710.         bibcode=bibcode.replace(/([0-9])([A-Za-z])/g,
  1711.                    function (str, p1, p2, offset, s) {
  1712.                           return p1 + ":" + p2;
  1713.                    }
  1714.                 )    
  1715.         
  1716.  
  1717.         var getURL = "http://ideas.repec.org/cgi-bin/ref.cgi?handle=RePEc";
  1718.         getURL = getURL + bibcode + "&output=3";
  1719.                 
  1720.         var idarray = new Array();
  1721.         idarray.push(getURL);
  1722.         parseRIS(idarray);
  1723.         
  1724.     }
  1725.  
  1726.  
  1727. }');
  1728.  
  1729. REPLACE INTO translators VALUES ('e4660e05-a935-43ec-8eec-df0347362e4c', '1.0.0b4.r1', '', '2007-07-31 16:45:00', '0', '100', '4', 'ERIC', 'Ramesh Srigiriraju', '^http://(?:www\.)?eric\.ed\.gov/', 
  1730. 'function detectWeb(doc, url)    {
  1731.     var namespace=doc.documentElement.namespaceURI;
  1732.     var nsResolver=namespace?function(prefix)    {
  1733.         return (prefix=="x")?namespace:null;
  1734.     }:null;
  1735.     var searchpath=''//form[@name="searchResultsForm"][@id="searchResultsForm"]'';
  1736.     if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  1737.         return "multiple";
  1738.     var singpath=''//tr/td[@class="primaryHeader"][contains(text(), "Result Details")]'';
  1739.     if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  1740.         var typepath=''//tr[td/strong/text()="Pub Types:"]/td[2]/text()'';
  1741.         var typestr=doc.evaluate(typepath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  1742.         var typereg=new RegExp("([^;/\-]+)");
  1743.         var typearr=typereg.exec(typestr);
  1744.         if(typearr[1]=="Journal Articles")
  1745.             return "journalArticle";
  1746.         if(typearr[1]=="Information Analyses")
  1747.             return "journalArticle";
  1748.         if(typearr[1]="Machine")
  1749.             return "computerProgram";
  1750.         if(typearr[1]="Computer Programs")
  1751.             return "computerProgram";
  1752.         if(typearr[1]="Dissertations")
  1753.             return "thesis";
  1754.         if(typearr[1]="Reports")
  1755.             return "report";
  1756.         if(typearr[1]="Non")
  1757.             return "audioRecording";
  1758.         if(typearr[1]="Legal")
  1759.             return "statute";
  1760.         else
  1761.             return "book";
  1762.     }
  1763. }', 
  1764. 'function doWeb(doc, url)    {
  1765.     var namespace=doc.documentElement.namespaceURI;
  1766.     var nsResolver=namespace?function(prefix)    {
  1767.         return (prefix=="x")?namespace:null;
  1768.     }:null;
  1769.     var searchpath=''//form[@name="searchResultsForm"][@id="searchResultsForm"]'';
  1770.     if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  1771.         var string="http://eric.ed.gov/ERICWebPortal/custom/portlets/clipboard/performExport.jsp";
  1772.         var idpath=''//a[img]/@id'';
  1773.         var ids=doc.evaluate(idpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  1774.         var items=new Array();
  1775.         var titlpath=''//tr[1]/td[1]/p/a'';
  1776.         var titlerows=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  1777.         var id;
  1778.         while(id=ids.iterateNext())
  1779.             items[id.nodeValue]=Zotero.Utilities.cleanTags(Zotero.Utilities.cleanString(titlerows.iterateNext().textContent));
  1780.         items=Zotero.selectItems(items);
  1781.         var string="http://eric.ed.gov/ERICWebPortal/custom/portlets/clipboard/performExport.jsp?";
  1782.         for(var ids in items)
  1783.             string+="accno="+ids+"&";
  1784.         string+="texttype=endnote&citationtype=brief&Download.x=86&Download.y=14";
  1785.         Zotero.Utilities.HTTP.doGet(string, function(text)    {
  1786.             var trans=Zotero.loadTranslator("import");
  1787.             trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  1788.             trans.setString(text);
  1789.             trans.setHandler("itemDone", function(obj, newItem)    {
  1790.                 var linkpath=''//tbody[tr/td/a/@id="''+newItem.itemID+''"]/tr/td/p/a[@class="action"]'';
  1791.                 var link=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  1792.                 if(link)
  1793.                     newItem.attachments.push({url:link.href, title:newItem.title, mimeType:"application/pdf"});
  1794.                 newItem.complete();
  1795.             });
  1796.             trans.translate();
  1797.             Zotero.done();
  1798.         });
  1799.         Zotero.wait();
  1800.     }
  1801.     var singpath=''//tr/td[@class="primaryHeader"][contains(text(), "Result Details")]'';
  1802.     if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  1803.         var idpath=''//input[@type="hidden"][@name="accno"]/@value'';
  1804.         var idpath2=''//meta[@name="eric #"]/@content'';
  1805.         var id;
  1806.         var temp=doc.evaluate(idpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  1807.         if(temp)
  1808.             id=temp.nodeValue;
  1809.         else
  1810.             id=doc.evaluate(idpath2, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  1811.         var string="http://eric.ed.gov/ERICWebPortal/custom/portlets/clipboard/performExport.jsp?accno=";
  1812.         string+=id+"&texttype=endnote&citationtype=brief&Download.x=86&Download.y=14";
  1813.         Zotero.Utilities.HTTP.doGet(string, function(text)    {
  1814.             var trans=Zotero.loadTranslator("import");
  1815.             trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  1816.             trans.setString(text);
  1817.             trans.setHandler("itemDone", function(obj, newItem)    {
  1818.                 var linkpath=''//tr/td/p[img/@alt="PDF"]/a'';
  1819.                 var link=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  1820.                 if(link)
  1821.                     newItem.attachments.push({url:link.href, title:newItem.title, mimeType:"application/pdf"});
  1822.                 newItem.complete();
  1823.             });
  1824.             trans.translate();
  1825.             Zotero.done();
  1826.         });
  1827.         Zotero.wait();
  1828.     }
  1829. }');
  1830.  
  1831. REPLACE INTO translators VALUES ('5dd22e9a-5124-4942-9b9e-6ee779f1023e', '1.0.0b4.r5', '', '2007-11-29 18:00:00', '1', '100', '4', 'Flickr', 'Sean Takats', '^http://(?:www\.)?flickr\.com/', 
  1832. 'function detectWeb(doc, url) {
  1833.     var namespace = doc.documentElement.namespaceURI;
  1834.     var nsResolver = namespace ? function(prefix) {
  1835.             if (prefix == ''x'') return namespace; else return null;
  1836.         } : null;
  1837.  
  1838.     if (elmt = doc.evaluate(''//h1[@property="dc:title" and starts-with(@id, "title_div")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){                               
  1839.         return "artwork";
  1840.     } else if (doc.evaluate(''//td[@class="DetailPic"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  1841.         return "multiple";
  1842.     } else if (doc.evaluate(''//div[@class="StreamView"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  1843.         return "multiple";
  1844.     } else if (doc.evaluate(''//div[@id="setThumbs"]/a[starts-with(@id, "set_thumb_link_")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  1845.         return "multiple";
  1846.     } else if (doc.evaluate(''//p[@class="StreamList" or @class="UserTagList"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  1847.         return "multiple";
  1848.     }
  1849. }', 
  1850. 'function doWeb(doc, url) {
  1851.     var namespace = doc.documentElement.namespaceURI;
  1852.     var nsResolver = namespace ? function(prefix) {
  1853.             if (prefix == ''x'') return namespace; else return null;
  1854.         } : null;
  1855.         
  1856.     var items = new Object();
  1857.     var photo_ids = new Array();
  1858.     var uris = new Array();
  1859.     var key = "3cde2fca0879089abf827c1ec70268b5";
  1860.  
  1861.     var elmts;
  1862.     var elmt;
  1863.  
  1864. // single result
  1865.     if (elmt = doc.evaluate(''//h1[@property="dc:title" and starts-with(@id, "title_div")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){                               
  1866.         var photo_id = elmt.id;
  1867.         photo_id = photo_id.substr(9);
  1868.         photo_ids.push(photo_id);
  1869.     } else { //multiple results
  1870.         var photoRe = /\/photos\/[^\/]*\/([0-9]+)\//;
  1871. //search results
  1872.         if (doc.evaluate(''//td[@class="DetailPic"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  1873.             elmts = doc.evaluate(''//td[@class="DetailPic"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1874.             while (elmt = elmts.iterateNext()){
  1875.                 var title = elmt.title;
  1876.                 title = Zotero.Utilities.trimInternal(title);
  1877.                 var link = elmt.href;
  1878.                 var m = photoRe(link);
  1879.                 var photo_id = m[1];
  1880.                 items[photo_id] = title;
  1881.             }
  1882. // photo stream
  1883.         } else if (doc.evaluate(''//div[@class="StreamView"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  1884.             elmts = doc.evaluate(''//div[@class="StreamView" and starts-with(@id, "sv_title_")]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1885.             while (elmt = elmts.iterateNext()){
  1886.                 var title = Zotero.Utilities.trimInternal(elmt.textContent);
  1887.                 var photo_id = elmt.id;
  1888.                 photo_id = photo_id.substr(9);
  1889.                 items[photo_id] = title;
  1890.             }
  1891. // photo set
  1892.         } else if (doc.evaluate(''//div[@id="setThumbs"]/a[starts-with(@id, "set_thumb_link_")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  1893.             elmts = doc.evaluate(''//div[@id="setThumbs"]/a[starts-with(@id, "set_thumb_link_")]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1894.             while (elmt = elmts.iterateNext()){
  1895.                 var title = Zotero.Utilities.trimInternal(elmt.title);
  1896.                 var photo_id = elmt.id.substr(15);
  1897.                 items[photo_id] = title;
  1898.             }
  1899. // tagged with
  1900.         } else if (doc.evaluate(''//p[@class="StreamList" or @class="UserTagList"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  1901.             var elmts = doc.evaluate(''//p[@class="StreamList" or @class="UserTagList"]/a[img]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  1902.             while (elmt = elmts.iterateNext()){
  1903.                 var title = Zotero.Utilities.trimInternal(elmt.title);
  1904.                 var link = elmt.href;
  1905.                 var m = photoRe(link);
  1906.                 var photo_id = m[1];
  1907.                 items[photo_id] = title;
  1908.             }
  1909.         }
  1910.         items = Zotero.selectItems(items);
  1911.         if(!items) return true;
  1912.         for(var i in items) {
  1913.             photo_ids.push(i);
  1914.         }
  1915.     }
  1916.     for each(var photo_id in photo_ids){
  1917.         uris.push("http://api.flickr.com/services/rest/?method=flickr.photos.getInfo&api_key="+key+"&photo_id="+photo_id);
  1918.     }
  1919.     Zotero.Utilities.HTTP.doGet(uris, function(text) {
  1920.         text = text.replace(/<\?xml[^>]*\?>/, "");
  1921.         var xml = new XML(text);
  1922.         var newItem = new Zotero.Item("artwork");
  1923.         var title = "";
  1924.         if (xml..title.length()){
  1925.             var title = Zotero.Utilities.cleanString(xml..title[0].text().toString());
  1926.             if (title == ""){
  1927.                 title = " ";
  1928.             }
  1929.             newItem.title = title;
  1930.         }
  1931.         for(var i=0; i<xml..tag.length(); i++) {
  1932.             newItem.tags.push(Zotero.Utilities.cleanString(xml..tag[i].text().toString()));
  1933.         }
  1934.         if (xml..dates.length()){
  1935.             var date = xml..dates[0].@taken.toString();
  1936.             newItem.date = date.substr(0, 10);
  1937.         }
  1938.         if (xml..owner.length()){
  1939.             var author = xml..owner[0].@realname.toString();
  1940.             if (author == ""){
  1941.                 author = xml..owner[0].@username.toString();
  1942.             }
  1943.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "artist"));
  1944.         }
  1945.         if (xml..url.length()){
  1946.             newItem.url = xml..url[0].text().toString();
  1947.         }
  1948.         if (xml..description.length()){
  1949.             newItem.abstractNote = xml..description[0].text().toString();
  1950.         }
  1951.         var format = xml..photo[0].@originalformat.toString();
  1952.         var photo_id = xml..photo[0].@id.toString();
  1953.         
  1954. // get attachment code
  1955.         var uri = "http://api.flickr.com/services/rest/?method=flickr.photos.getSizes&api_key="+key+"&photo_id="+photo_id;
  1956.         Zotero.Utilities.HTTP.doGet(uri, function(text) {
  1957.             text = text.replace(/<\?xml[^>]*\?>/, "");
  1958.             var xml = new XML(text);
  1959.             var last = xml..size.length() - 1;
  1960.             var attachmentUri = xml..size[last].@source.toString();
  1961.             newItem.attachments = [{title:title, url:attachmentUri}];
  1962.             newItem.complete();
  1963.         }, function(){Zotero.done();});    
  1964.     });
  1965.     Zotero.wait();
  1966. }');
  1967.  
  1968. REPLACE INTO translators VALUES ('d3b1d34c-f8a1-43bb-9dd6-27aa6403b217', '1.0.0b4.r5', '', '2008-01-09 20:00:00', '0', '100', '4', 'YouTube', 'Sean Takats', 'https?://[^/]*youtube\.com\/', 
  1969. 'function detectWeb(doc, url){
  1970.     var namespace = doc.documentElement.namespaceURI;
  1971.     var nsResolver = namespace ? function(prefix) {
  1972.             if (prefix == ''x'') return namespace; else return null;
  1973.         } : null;
  1974.         
  1975.     var xpath = ''//input[@type="hidden" and @name="video_id"]'';
  1976.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  1977.         return "videoRecording";
  1978.     }
  1979.     if (doc.evaluate(''//a[@class="newvtitlelink"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  1980.         return "multiple";
  1981.     }
  1982.     if (doc.evaluate(''//div[starts-with(@class, "vtitle")]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){    
  1983.         return "multiple";
  1984.     }
  1985. }
  1986.  
  1987. ', 
  1988. 'function doWeb(doc, url){
  1989.     var namespace = doc.documentElement.namespaceURI;
  1990.     var nsResolver = namespace ? function(prefix) {
  1991.             if (prefix == ''x'') return namespace; else return null;
  1992.         } : null;
  1993.     var video_ids = new Array();
  1994.     var xpath = ''//input[@type="hidden" and @name="video_id"]'';
  1995.     var elmts;
  1996.     var elmt;
  1997.     elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  1998.     elmt = elmts.iterateNext();
  1999.     if(elmt) {
  2000.         //single video
  2001.         var video_id = elmt.value;
  2002.         video_ids.push(video_id);
  2003.     } else {
  2004.         // multiple videos
  2005.         var items = new Object();
  2006.         var videoRe = /\/watch\?v=([a-zA-Z0-9-]+)/;
  2007. // search results        
  2008.         if (elmt = doc.evaluate(''//a[@class="newvtitlelink"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  2009.             elmts = doc.evaluate(''//a[@class="newvtitlelink"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2010. // categories and community pages and user pages and browse pages
  2011.         } else if (doc.evaluate(''//div[starts-with(@class, "vtitle")]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  2012.             elmts = doc.evaluate(''//div[starts-with(@class, "vtitle")]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  2013.         }
  2014.         while (elmt = elmts.iterateNext()){
  2015.             var title = elmt.textContent;
  2016.             title = Zotero.Utilities.trimInternal(title);
  2017.             var link = elmt.href;
  2018.             var m = videoRe(link);
  2019.             var video_id = m[1];
  2020.             items[video_id] = title;
  2021.         }
  2022.         items = Zotero.selectItems(items);
  2023.         if(!items) return true;
  2024.         for(var i in items) {
  2025.             video_ids.push(i);
  2026.         }
  2027.     }
  2028.     getData(video_ids);            
  2029. }
  2030.  
  2031. function getData(ids){
  2032.     var uris = new Array();    
  2033.     var url = "http://gdata.youtube.com/feeds/videos/";
  2034.     for each(var id in ids){
  2035.         uris.push(url+id);
  2036.     }
  2037.     Zotero.Utilities.HTTP.doGet(uris, function(text) {
  2038.         // clean up header
  2039.         text = text.replace(/<\?xml[^>]*\?>/, "");
  2040.         text = text.replace(/<entry[^>]*>/, "<entry>");
  2041.         // replace colons in XML tags
  2042.         text = text.replace(/<media:/g, "<media_").replace(/<\/media:/g, "</media_");
  2043. //        text = text.replace(/<yt:/g, "<yt_").replace(/<\/yt:/g, "</yt_");
  2044.         text = text.replace(/yt:/g, "yt_");
  2045.         text = text.replace(/<gd:/g, "<gd_").replace(/<\/gd:/g, "</gd_");
  2046.         // pad xml
  2047.         text = "<zotero>"+text+"</zotero>";
  2048.         var xml = new XML(text);
  2049.         var newItem = new Zotero.Item("videoRecording");
  2050.         var title = "";
  2051.         var title = xml..media_title[0].text().toString();
  2052.         if (xml..media_title.length()){
  2053.             var title = Zotero.Utilities.cleanString(xml..media_title[0].text().toString());
  2054.             if (title == ""){
  2055.                 title = " ";
  2056.             }
  2057.             newItem.title = title;
  2058.         }
  2059.         if (xml..media_keywords.length()){
  2060.             var keywords = xml..media_keywords[0].text().toString();
  2061.             keywords = keywords.split(",");
  2062.             for each(var tag in keywords){
  2063.                 newItem.tags.push(Zotero.Utilities.trimInternal(tag));
  2064.             }
  2065.         }
  2066.         if (xml..published.length()){
  2067.             var date = xml..published[0].text().toString();
  2068.             newItem.date = date.substr(0, 10);
  2069.         }
  2070.         if (xml..author.name.length()){
  2071.             var author = xml..author.name[0].text().toString();
  2072.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "contributor", true));
  2073.         }
  2074.         if (xml..media_player.length()){
  2075.             var url = xml..media_player[0].@url.toString();
  2076.             newItem.url = url;
  2077.             newItem.attachments.push({title:"YouTube Link", snapshot:false, mimeType:"text/html", url:url});
  2078.         }
  2079.         if (xml..yt_duration.length()){
  2080.             var runningTime = xml..yt_duration[0].@seconds.toString();
  2081.             newItem.runningTime = runningTime + " seconds";
  2082.         }
  2083.         if (xml..media_description.length()){
  2084.             newItem.abstractNote = xml..media_description[0].text().toString();
  2085.         }
  2086.         newItem.complete();        
  2087.     }, function(){Zotero.done();});    
  2088.     Zotero.wait();
  2089. }');
  2090.  
  2091. REPLACE INTO translators VALUES ('8b35ab14-f18a-4f69-8472-b2df18c984da', '1.0.0b4.r5', '', '2008-02-01 21:00:00', '0', '100', '4', 'Davidson College Library', 'Michael Berkowitz', 'http://www3.davidson.edu/', 
  2092. 'function detectWeb(doc, url) {
  2093.     if (url.indexOf("log_in") == -1) {
  2094.         if (url.indexOf("screen=Record") != -1) {
  2095.             return "book";
  2096.         } else {
  2097.             return "multiple";
  2098.         }
  2099.     }
  2100. }', 
  2101. 'function doWeb(doc, url) {
  2102.     var ids = new Array();
  2103.     if (detectWeb(doc, url) == "multiple") {
  2104.         var posturl = doc.evaluate(''//table/tbody/tr[2]/td[1]/table/tbody/tr[2]/td/a[1]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href.match(/[^?]*/)[0];
  2105.         var items = new Object();
  2106.         var xpath = ''//span[@class="smalllinks"]/a'';
  2107.         var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  2108.         var title = titles.iterateNext();
  2109.         var i = 1;
  2110.         while (title) {
  2111.             items[i] =Zotero.Utilities.trimInternal(title.textContent);
  2112.             title = titles.iterateNext();
  2113.             i++;
  2114.         }
  2115.         items = Zotero.selectItems(items);
  2116.         Zotero.debug(items);
  2117.         for (var i in items) {
  2118.             ids.push(i);
  2119.         }
  2120.     } else {
  2121.         ids.push(url.match(/item=(\d+)/)[1]);
  2122.         var posturl = url.match(/[^?]*/)[0];
  2123.     }
  2124.     Zotero.debug(ids);
  2125.     var posturl2 = posturl.replace("goto", "cart_add");
  2126.     var deletepost = posturl.replace("goto", "cart_remove");
  2127.     
  2128.     Zotero.Utilities.HTTP.doPost(deletepost, ''screen=Hitlist.html&records=all&server=1home'', function() {});
  2129.     
  2130.     for (var i = 0; i < ids.length ; i++) {
  2131.         Zotero.debug(ids[i]);
  2132.         
  2133.         Zotero.Utilities.HTTP.doPost(deletepost, ''screen=Hitlist.html&records=all&server=1home'', function() {});
  2134.         
  2135.         Zotero.Utilities.HTTP.doPost(posturl2, ''screen=Hitlist.html&server=1home&item='' + ids[i] + ''&item_source=1home'', function() {});
  2136.     
  2137.         Zotero.Utilities.HTTP.doPost(posturl, ''screen=SelectListBriefCiteRefworks.html&server=cart&item_source=1home'', function(text) {
  2138.             text = Zotero.Utilities.unescapeHTML(text);
  2139.             text = text.replace(/RT/, "TY");
  2140.             text = text.replace(/VO/, "VL");
  2141.             text = text.replace(/LK/, "UR");
  2142.             text = text.replace(/YR/, "PY");
  2143.             text = text.replace(/([A-Z][A-Z\d]\s)/g, "$1 - ");
  2144.             Zotero.debug(text);
  2145.             var translator = Zotero.loadTranslator("import");
  2146.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  2147.             translator.setString(text);
  2148.             translator.setHandler("itemDone", function(obj, item) {
  2149.                 item.itemType = "book";
  2150.                 for (var i in item.creators) {
  2151.                     var name = item.creators[i].lastName.match(/(\w+)\s+(.*)/);
  2152.                     item.creators[i].lastName = name[1];
  2153.                     item.creators[i].firstName = name[2];
  2154.                 }
  2155.                 item.complete();
  2156.             });
  2157.             translator.translate();
  2158.             
  2159.         });
  2160.         
  2161.         Zotero.Utilities.HTTP.doPost(deletepost, ''screen=Hitlist.html&records=all&server=1home'', function() {});
  2162.     }
  2163. }');
  2164.  
  2165. REPLACE INTO translators VALUES ('1885b93c-cf37-4b25-aef5-283f42eada9d', '1.0.0b4.r5', '', '2008-02-01 19:30:00', '0', '100', '4', 'Informaworld', 'Michael Berkowitz', 'http://www.informaworld.com', 
  2166. 'function detectWeb(doc, url) {
  2167.     if (url.indexOf("quicksearch") != -1) {
  2168.         return "multiple";
  2169.     } else if (doc.evaluate(''//a[substring(text(), 2, 8) = "Download"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2170.         if (doc.evaluate(''//div[@id="metahead"]/div/strong[text() = "Published in:"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2171.             var pubtype = doc.evaluate(''//img[substring(@title, 1, 17) = "Publication type:"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().title;
  2172.             if (pubtype.match("journal")) {
  2173.                 return "journalArticle";
  2174.             } else if (pubtype.match("book")) {
  2175.                 return "bookSection";
  2176.             }
  2177.         } else {
  2178.             return "book";
  2179.         }
  2180.     } else if (url.indexOf("content=g") != -1 || 
  2181.             doc.evaluate(''//div[@id="browse"]//tbody/tr/td[2]/a[2]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext() ||
  2182.             doc.evaluate(''//div[@id="title"]//td[2]/div/strong/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2183.         return "multiple";
  2184.     } else {
  2185.         return true;
  2186.     }
  2187. }
  2188. ', 
  2189. 'function doWeb(doc, url) {
  2190.     var links = new Array();
  2191.     if (detectWeb(doc, url) == "multiple") {
  2192.         var items = new Object();
  2193.         if (doc.evaluate(''//div[@id="quicksearch"]//tr/td/b/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2194.             var xpath = ''//div[@id="quicksearch"]//tr/td/b/a'';
  2195.         } else if (doc.evaluate(''//div[@id="title"]/table/tbody/tr[2]//strong/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2196.             var xpath = ''//div[@id="title"]/table/tbody/tr[2]//strong/a'';
  2197.         } else if (doc.evaluate(''//div[@id="browse"]//tbody/tr/td[2]/a[2]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2198.             var xpath = ''//div[@id="browse"]//tbody/tr/td[2]/a[2]'';
  2199.         } else if (doc.evaluate(''//div[@id="title"]//td[2]/div/strong/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2200.             var xpath = ''//div[@id="title"]//td[2]/div/strong/a'';
  2201.         }
  2202.         var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  2203.         var title = titles.iterateNext();
  2204.         while (title) {
  2205.             items[title.href] = title.textContent;
  2206.             title = titles.iterateNext();
  2207.         }
  2208.         items = Zotero.selectItems(items);
  2209.         for (var i in items) {
  2210.             links.push(i);
  2211.         }
  2212.     } else {
  2213.         links = [url];
  2214.     }
  2215.     Zotero.debug(links);
  2216.     
  2217.     Zotero.Utilities.processDocuments(links, function(newDoc) {
  2218.         var xpath = ''//div[@id="metahead"]/div'';
  2219.         var stuff = newDoc.evaluate(xpath, newDoc, null, XPathResult.ANY_TYPE, null);
  2220.         var thing = stuff.iterateNext() ;
  2221.         while (thing) {
  2222.             if (thing.textContent.match(/DOI/)) {
  2223.                 var doi = Zotero.Utilities.trimInternal(thing.textContent).match(/:\s+(.*)/)[1];
  2224.             }
  2225.             thing = stuff.iterateNext();
  2226.         }
  2227.         
  2228.         var id = newDoc.location.href.match(/content=([\w\d]+)/);
  2229.         var post = ''tab=citation&selecteditems='' + id[1].substr(1) + ''&content='' + id[1] + ''&citstyle=refworks&showabs=false&format=file'';
  2230.         Zotero.Utilities.HTTP.doPost(''http://www.informaworld.com/smpp/content'', post, function(text) {
  2231.             text = text.replace(/RT/, "TY");
  2232.             text = text.replace(/VO/, "VL");
  2233.             text = text.replace(/LK/, "UR");
  2234.             text = text.replace(/YR/, "PY");
  2235.             text = text.replace(/([A-Z][A-Z\d]\s)/g, "$1 - ")
  2236.             var translator = Zotero.loadTranslator("import");
  2237.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  2238.             translator.setString(text);
  2239.             translator.setHandler("itemDone", function(obj, item) {
  2240.                 var type = text.match(/TY\s+\-\s+([^\n]*)/)[1];
  2241.                 Zotero.debug(type);
  2242.                 if (type == "Journal") {
  2243.                     item.itemType = "journalArticle";
  2244.                 } else if (type == "Book, Whole") {
  2245.                     item.itemType = "book";
  2246.                 } else if (type == "Book, Section") {
  2247.                     item.itemType = "bookSection";
  2248.                 }
  2249.                 if (doi) {
  2250.                     item.DOI = doi;
  2251.                 }
  2252.                 item.complete();
  2253.             });
  2254.             translator.translate();
  2255.             
  2256.         });
  2257.     }, function() {Zotero.done;});
  2258. }');
  2259.  
  2260. REPLACE INTO translators VALUES ('f880bf79-d42f-4337-b0d2-7a7de4a48b7d', '1.0.0b4.r5', '', '2008-01-31 20:00:00', '0', '100', '6', 'Library Catalog (X-OPAC)', 'Michael Berkowitz', '(xopac|hylib)', 
  2261. 'function detectWeb(doc, url) {
  2262.     if (url.indexOf("&nd=") != -1) {
  2263.         return "book";
  2264.     } else if (url.indexOf("Aktion") != -1) {
  2265.         return "multiple";
  2266.     }
  2267. }', 
  2268. 'function doWeb(doc, url) {
  2269.     var ids = new Array();
  2270.     if (detectWeb(doc, url) == "multiple") {
  2271.         var xpath = ''//table/tbody/tr/td//a'';
  2272.         var links = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  2273.         var link = links.iterateNext();
  2274.         var items = new Object();
  2275.         while (link) {
  2276.             if (link.href.match(/&nd=\d+/)) {
  2277.                 items[link.href.match(/&nd=(\d+)/)[1]] = Zotero.Utilities.trimInternal(link.textContent);
  2278.             }
  2279.             link = links.iterateNext();
  2280.         }
  2281.         items = Zotero.selectItems(items);
  2282.         for (var i in items) {
  2283.             ids.push(i);
  2284.         }
  2285.     } else {
  2286.         ids = [url.match(/&nd=(\d+)/)[1]];
  2287.     }
  2288.     Zotero.debug(ids);
  2289.     for (var i = 0 ; i < ids.length ; i++) {
  2290.         var post = ''db=ubfr&nd='' + ids[i] + ''&counter=0&Aktion=S&VomOLAF=0&links=1&gk=&format=ris'';
  2291.         Zotero.Utilities.HTTP.doPost(''http://www.ub.uni-freiburg.de/cgi-bin/refman'', post, function(text) {
  2292.             //Zotero.debug(text);
  2293.             var translator = Zotero.loadTranslator("import");
  2294.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  2295.             translator.setString(text);
  2296.             translator.translate();
  2297.         });
  2298.     }
  2299. }');
  2300.  
  2301. REPLACE INTO translators VALUES ('0cdc6a07-38cf-4ec1-b9d5-7a3c0cc89b15', '1.0.0b4.r5', '', '2008-01-30 21:00:00', '0', '100', '4', 'OSTI Energy Citations', 'Michael Berkowitz', 'http://www.osti.gov/energycitations', 
  2302. 'function detectWeb(doc, url) {
  2303.     if (doc.evaluate(''//table[@class="searchresults"]//a[@class="citation"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2304.         return "multiple";
  2305.     } else if (url.indexOf("product.biblio.jsp") != -1) {
  2306.         return "journalArticle";
  2307.     }
  2308. }', 
  2309. 'function doWeb(doc, url) {
  2310.     var urls = new Array();
  2311.     if (detectWeb(doc, url) == "multiple") {
  2312.         var items = new Object();
  2313.         var xpath = ''//table[@class="searchresults"]//a[@class="citation"]'';
  2314.         var links = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  2315.         var next_link;
  2316.         while (next_link = links.iterateNext()) {
  2317.             items[next_link.href] = next_link.textContent;
  2318.         }
  2319.         items = Zotero.selectItems(items);
  2320.         for (var i in items) {
  2321.             urls.push(i.match(/osti_id=\d+/)[0]);
  2322.         }
  2323.     } else {
  2324.         urls = [url.match(/osti_id=\d+/)[0]];
  2325.     }
  2326.     for (var i = 0 ; i < urls.length ; i++) {
  2327.         var getstr = ''http://www.osti.gov/energycitations/endnote?osti_id=140097'';
  2328.         Zotero.Utilities.HTTP.doGet(getstr, function(text) {
  2329.             text = text.replace(/(%.)/g, "$1 ");
  2330.             var trans = Zotero.loadTranslator("import");
  2331.             trans.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d");
  2332.             trans.setString(text);
  2333.             trans.translate();
  2334.         });
  2335.     }
  2336. }');
  2337.  
  2338. REPLACE INTO translators VALUES ('4345839f-b4fd-4e3f-a73d-268b6f280f6e', '1.0.0b4.r5', '', '2008-01-29 20:00:00', '0', '100', '4', 'Journal of Vision', 'Michael Berkowitz', 'http://(www.)?journalofvision.org/', 
  2339. 'function detectWeb(doc, url) {
  2340.     if (url.indexOf("search.aspx?") != -1 ||  url.match(/\d+/g).length == 2) {
  2341.         return "multiple";
  2342.     } else if (url.match(/\d+/g).length == 3) {
  2343.         return "journalArticle";
  2344.     }
  2345. }', 
  2346. 'function doWeb(doc, url) {
  2347.     var urls = new Array();
  2348.     if (detectWeb(doc, url) == "multiple") {
  2349.         var items = new Object();
  2350.          if (doc.evaluate(''//a[@class="AbsTitle"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2351.              var xpath = ''//a[@class="AbsTitle"]'';
  2352.          } else if (doc.evaluate(''//a[@class="toc_ArticleTitle"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2353.              var xpath = ''//a[@class="toc_ArticleTitle"]'';
  2354.          }
  2355.          var articles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  2356.          var next_art;
  2357.          while (next_art = articles.iterateNext()) {
  2358.              items[next_art.href] = next_art.textContent;
  2359.          }
  2360.         items = Zotero.selectItems(items);
  2361.         for (var i in items) {
  2362.             urls.push(i);
  2363.         }
  2364.     } else {
  2365.         urls.push(url);
  2366.     }
  2367.     Zotero.debug(urls);
  2368.     
  2369.     Zotero.Utilities.processDocuments(urls, function(newDoc) {
  2370.         var rislink = newDoc.evaluate(''//div[@id="block0"]/table/tbody/tr/td[@class="body"]/a'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href.replace("info/GetCitation", "AutomaticCitationDownload") + ''&type=ReferenceManager'';
  2371.         var DOI = newDoc.evaluate(''//td[2]/span[@class="toc_VolumeLine"]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/doi:\s*(.*)$/)[1];
  2372.         var PDF = newDoc.evaluate(''//div[@class="jovHistory"]//td[2]/a'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().href;
  2373.         Zotero.debug(rislink);
  2374.         Zotero.Utilities.HTTP.doGet(rislink, function(text) {
  2375.             var translator = Zotero.loadTranslator("import");
  2376.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  2377.             translator.setString(text);
  2378.             translator.setHandler("itemDone", function(obj, item) {
  2379.                 item.DOI = DOI;
  2380.                 item.publicationTitle = "Journal of Vision";
  2381.                 item.attachments = [{url:PDF, title:"Journal of Vision Full Text PDF", mimeType:"application/pdf"}];
  2382.                 item.complete();
  2383.             });
  2384.             translator.translate();
  2385.         });
  2386.     }, function() {Zotero.done;});
  2387. }');
  2388.  
  2389. REPLACE INTO translators VALUES ('966a7612-900c-42d9-8780-2a3247548588', '1.0.0b4.r5', '', '2008-01-25 20:00:00', '0', '100', '4', 'eMJA', 'Michael Berkowitz', 'http://www.mja.com.au/', 
  2390. 'function detectWeb(doc, url) {
  2391.     if (doc.evaluate(''//p[@class="Pfoot"]/b/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(''/html/body/table/tbody/tr[1]/td[2]/a/b'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2392.         return "multiple";
  2393.     } else if (doc.title.indexOf("eMJA:") != -1) {
  2394.         return "journalArticle";
  2395.     }
  2396. }', 
  2397. 'function senCase(string) {
  2398.     var smallwords = Array("and", "a", "in", "the", "by", "of", "s", "on");
  2399.     var sen = string.split(/\b/);
  2400.     for (var i = 0 ; i < sen.length; i++) {
  2401.         if (sen[i].match(/\w+/)) {
  2402.             if (smallwords.indexOf(sen[i]) != -1 && i != 0) {
  2403.                 sen[i] = sen[i].toLowerCase();
  2404.             } else {
  2405.                 sen[i] = sen[i][0].toUpperCase() + sen[i].substring(1).toLowerCase();
  2406.             }
  2407.         }
  2408.     }
  2409.     return sen.join("");
  2410. }
  2411.  
  2412. function doWeb(doc, url) {
  2413.     var URIs = new Array();
  2414.     
  2415.     if (doc.evaluate(''//p[@class="Pfoot"]/b/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2416.         var xpath = ''//p[@class="Pfoot"]/b/a'';
  2417.     } else if (doc.evaluate(''//tr[1]/td[2]/a/b'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2418.         var xpath = ''//tr[1]/td[2]/a/b'';
  2419.         var linkpath = ''//tr[2]/td[2]/small[@class="gr"]'';
  2420.     }
  2421.     
  2422.     if (xpath) {
  2423.         if (linkpath) {
  2424.             var items = new Object();
  2425.             var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  2426.             var links = doc.evaluate(linkpath, doc, null, XPathResult.ANY_TYPE, null);
  2427.             var title = titles.iterateNext();
  2428.             var link = links.iterateNext();
  2429.             while (title) {
  2430.                 //Zotero.debug(Zotero.Utilities.cleanString(title.textContent));
  2431.                 //Zotero.debug(Zotero.Utilities.cleanString(link.textContent));
  2432.                 items[Zotero.Utilities.cleanString(link.textContent)] = Zotero.Utilities.cleanString(title.textContent).substring(6);
  2433.                 title = titles.iterateNext();
  2434.                 link = links.iterateNext();
  2435.             }
  2436.         } else {
  2437.             var items = new Object();
  2438.             var things = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  2439.             var next_thing = things.iterateNext();
  2440.             while (next_thing) {
  2441.                 items[next_thing.href] = senCase(Zotero.Utilities.cleanString(next_thing.textContent));
  2442.                 next_thing = things.iterateNext();
  2443.             }
  2444.         }
  2445.         items = Zotero.selectItems(items);
  2446.         Zotero.debug(items);
  2447.         for (var i in items) {
  2448.             URIs.push(i);
  2449.         }
  2450.     } else {
  2451.         URIs.push(url);
  2452.     }
  2453.     Zotero.debug(URIs);
  2454.     Zotero.Utilities.processDocuments(URIs, function(newDoc) {
  2455.         var newItem = new Zotero.Item("journalArticle");
  2456.         newItem.title = senCase(newDoc.title.substring(6));
  2457.         
  2458.         newItem.publicationTitle = "The Medical Journal of Australia";
  2459.         newItem.ISSN = "0025-729X";
  2460.         newItem.url = newDoc.location.href;
  2461.         
  2462.         //date
  2463.         newItem.date = newDoc.evaluate(''//meta[@name="date"]/@content'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.substring(0,10);
  2464.         
  2465.         //voliss
  2466.         var voliss = newDoc.evaluate(''//meta[@name="citation"]/@content'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  2467.         //voliss = voliss.match(/[^\d]+(\d+)\s+\((\d+)\)/);
  2468.         voliss = voliss.match(/;\s+(\d+)\s+\((\d+)[^:]+:\s+(.*)\.$/);
  2469.         newItem.volume = voliss[1];
  2470.         newItem.issue = voliss[2];
  2471.         newItem.pages = voliss[3];
  2472.         
  2473.         //authors
  2474.         var authors = new Array();
  2475.         var apath = ''//div[@class="By"]/span[@class="Pn"]'';
  2476.         var author = newDoc.evaluate(apath, newDoc, null, XPathResult.ANY_TYPE, null);
  2477.         var next_a = author.iterateNext();
  2478.         while (next_a) {
  2479.             var name = next_a.textContent;
  2480.             if (name.substring(0,1) == ",") {
  2481.                 name = name.substring(2);
  2482.             } else if (name.substring(0,4) == " and") {
  2483.                 name = name.substring(5);
  2484.             }
  2485.             authors.push(name);
  2486.             next_a = author.iterateNext();
  2487.         }
  2488.         
  2489.         for (var i in authors) {
  2490.             newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i], "author"));
  2491.         }
  2492.         
  2493.         //attachments
  2494.         newItem.attachments = [
  2495.             {url:newDoc.location.href, title:"eMJA Snapshot", mimeType:"text/html"},
  2496.             {url:newDoc.location.href.replace(".html", ".pdf") , title:"eMJA PDF", mimeType:"application/pdf"}
  2497.         ];
  2498.         newItem.complete();
  2499.     }, function() {Zotero.done;});
  2500. }');
  2501.  
  2502. REPLACE INTO translators VALUES ('303c2744-ea37-4806-853d-e1ca67be6818', '1.0.0b4.r5', '', '2008-01-16 21:00:00', '0', '100', '4', 'CSIRO Publishing', 'Michael Berkowitz', 'http://www.publish.csiro.au/', 
  2503. 'function detectWeb(doc, url) {
  2504.     if (doc.evaluate(''//a[@class="searchBoldBlue"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(''//td[2]/a[@class="linkJournal"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2505.         return "multiple";
  2506.     } else if (url.indexOf("/view/journals/") != -1 || url.indexOf("paper") != -1) {
  2507.         return "journalArticle";
  2508.     }
  2509. }', 
  2510. 'function doWeb(doc, url) {
  2511.     var links = new Array();
  2512.     if (detectWeb(doc, url) == "multiple") {
  2513.         var items = new Object();
  2514.         if (doc.evaluate(''//a[@class="searchBoldBlue"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2515.             var arts = doc.evaluate(''//a[@class="searchBoldBlue"]'', doc, null, XPathResult.ANY_TYPE, null);
  2516.             var art = arts.iterateNext();
  2517.             while (art) {
  2518.                 items[art.href] = art.textContent;
  2519.                 art = arts.iterateNext();
  2520.             }
  2521.         } else if (doc.evaluate(''//td[2]/a[@class="linkJournal"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2522.             var arts = doc.evaluate(''//td[2]/a[@class="linkJournal"]'', doc, null, XPathResult.ANY_TYPE, null);
  2523.             var titles = doc.evaluate(''//td[3]//td[1]/table/tbody/tr/td/b'', doc, null, XPathResult.ANY_TYPE, null);
  2524.             var art = arts.iterateNext();
  2525.             var title = titles.iterateNext();
  2526.             while (art) {
  2527.                 items[art.href] = title.textContent;
  2528.                 art = arts.iterateNext();
  2529.                 title = titles.iterateNext();
  2530.             }
  2531.         }
  2532.         items = Zotero.selectItems(items);
  2533.         for (var i in items) {
  2534.             links.push(i.match(/([^/=.htm]*)(.htm)?$/)[1]);
  2535.         }
  2536.     } else {
  2537.         links.push(url.match(/([^/=.htm]*)(.htm)?$/)[1]);
  2538.     }
  2539.     for (var i in links) {
  2540.         var newURL = ''http://www.publish.csiro.au/view/journals/dsp_journal_retrieve_citation.cfm?ct='' + links[i] + ''.ris'';
  2541.         var pdfURL = ''http://www.publish.csiro.au/?act=view_file&file_id='' + links[i] + ''.pdf'';
  2542.         Zotero.Utilities.HTTP.doGet(newURL, function(text) {
  2543.             var translator = Zotero.loadTranslator("import");
  2544.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  2545.             translator.setString(text);
  2546.             translator.setHandler("itemDone", function(obj, item) {
  2547.                 item.itemType = "journalArticle";
  2548.                 if (item.notes[0]) {
  2549.                     item.abstractNote = item.notes[0].note;
  2550.                 }
  2551.                 item.attachments = [
  2552.                     {url:pdfURL, title:"CSIRO Publishing PDF", mimeType:"application/pdf"},
  2553.                     {url:newURL, title:"CSIRO Publishing Snaphost", mimeType:"text/html"}
  2554.                 ];
  2555.                 item.complete();
  2556.             });
  2557.             translator.translate();
  2558.         });
  2559.     }
  2560.     Zotero.wait();
  2561. }');
  2562.  
  2563. REPLACE INTO translators VALUES ('27ee5b2c-2a5a-4afc-a0aa-d386642d4eed', '1.0.0b4.r5', '', '2008-01-31 20:00:00', '0', '100', '4', 'PubMed Central', 'Michael Berkowitz', 'http://[^/]*.nih.gov/', 
  2564. 'function detectWeb(doc, url) {
  2565.     if (doc.evaluate(''//table[@id="ResultPanel"]//td[2]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2566.         return "multiple";
  2567.     } else if (url.indexOf("articlerender") != -1) {
  2568.         return "journalArticle";
  2569.     }
  2570. }', 
  2571. 'function doWeb(doc, url) {
  2572.     var tagMap = {journal_title:"publicationTitle",
  2573.                     title:"title",
  2574.                     date:"date",
  2575.                     issue:"issue",
  2576.                     volume:"volume",
  2577.                     doi:"DOI",
  2578.                     fulltext_html_url:"url"
  2579.                 }
  2580.     var URIs = new Array();
  2581.     var items = new Object();
  2582.     if (doc.title.indexOf("PMC Results") != -1) {
  2583.         var titlex = ''//table[@id="ResultPanel"]/tbody/tr[3]/td/div/table/tbody/tr/td[2]/div[@class="portal-tocentry"]/div[@class="toc-entry"]/div/div[@class="toc-title"]'';
  2584.         var linkx = ''//table[@id="ResultPanel"]/tbody/tr[3]/td/div/table/tbody/tr/td[2]/div[@class="portal-tocentry"]/div[@class="toc-entry"]/div/a[@class="toc-link"][2]'';
  2585.         
  2586.         var titles = doc.evaluate(titlex, doc, null, XPathResult.ANY_TYPE, null);
  2587.         var next_title = titles.iterateNext();
  2588.         var links = doc.evaluate(linkx, doc, null, XPathResult.ANY_TYPE, null);
  2589.         var next_link = links.iterateNext();
  2590.         while (next_title && next_link) {
  2591.             items[next_link.href] = next_title.textContent;
  2592.             next_title = titles.iterateNext();
  2593.             next_link = links.iterateNext();
  2594.         }
  2595.         items = Zotero.selectItems(items);
  2596.         for (var i in items) {
  2597.             var artid= i.match(/\d+/)[0];
  2598.             URIs.push(artid);
  2599.         }
  2600.     } else {
  2601.         URIs.push(url.match(/\d+/)[0]);
  2602.     }
  2603.     for (var id in URIs) {    
  2604.         Zotero.Utilities.HTTP.doGet(''http://www.pubmedcentral.nih.gov/articlerender.fcgi?tool=pmcentrez&artid='' + URIs[id], function(text) {
  2605.             var tags = new Object();
  2606.             var meta = text.match(/<meta[^>]*>/gi);
  2607.             for (var i in meta) {
  2608.                 var item = meta[i].match(/=\"([^"]*)\"/g);
  2609.                 if (item[0].substring(2, 10) == ''citation'') {
  2610.                     tags[item[0].substring(11, item[0].length - 1)] = item[1].substring(2, item[1].length - 1);
  2611.                 }
  2612.             }
  2613.             var newItem = new Zotero.Item("journalArticle");
  2614.             
  2615.             for (var tag in tagMap) {
  2616.                 newItem[tagMap[tag]] = Zotero.Utilities.unescapeHTML(tags[tag]);
  2617.             }
  2618.             
  2619.             for (var i in meta) {
  2620.                 if (meta[i].match(/DC.Contributor/)) {
  2621.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(meta[i].match(/content=\"([^"]*)\">/)[1], "author"));
  2622.                 }
  2623.             }
  2624.             
  2625.             newItem.attachments = [
  2626.                 {url:tags["fulltext_html_url"], title:"PubMed Central Snapshot", mimeType:"text/html"},
  2627.                 {url:tags["pdf_url"], title:"PubMed Central Full Text PDF", mimeType:"application/pdf"}
  2628.             ];
  2629.             
  2630.             newItem.complete();
  2631.         });
  2632.     }
  2633.     Zotero.wait();
  2634. }');
  2635.  
  2636. REPLACE INTO translators VALUES ('60d97c99-47f0-4323-98b6-5699faf827b1', '1.0.0b4.r5', '', '2008-01-09 20:00:00', '0', '100', '4', 'Blackwell Compass', 'Michael Berkowitz', 'http://www.blackwell-compass.com/subject/[^/]+/.+', 
  2637. 'function detectWeb(doc, url) {
  2638.     if (url.indexOf("search_results") != -1 || url.indexOf("section_home") != -1) {
  2639.         return "multiple";
  2640.     } else {
  2641.         return "journalArticle";
  2642.     }
  2643. }', 
  2644. 'function doWeb(doc, url) {
  2645.     var namespace = doc.documentElement.namespaceURI;
  2646.     var nsResolver = namespace ? function(prefix) {
  2647.         if (prefix == ''x'') return namespace; else return null;
  2648.     } : null;
  2649.     
  2650.     var URIs = new Array();
  2651.     var items = new Object();
  2652.     if (detectWeb(doc, url) == "multiple") {
  2653.         
  2654.         var xpath = ''//div[@class="article-holder"]//h4[@class="article"]/a'';
  2655.         var articles = doc.evaluate(xpath, doc, namespace, XPathResult.ANY_TYPE, null);
  2656.         var next_art = articles.iterateNext();
  2657.         while (next_art) {
  2658.             items[next_art.href] = next_art.textContent;
  2659.             next_art = articles.iterateNext();
  2660.         }
  2661.         items = Zotero.selectItems(items);
  2662.         
  2663.         for (var i in items) {
  2664.             URIs.push(i);
  2665.         }
  2666.     } else {
  2667.         URIs.push(url);
  2668.     }
  2669.     
  2670.     Zotero.Utilities.processDocuments(URIs, function(doc, urll) {
  2671.         var doi = doc.evaluate(''//div[@id="content"]/p/span[@class="guide"]/a[substring(@href, 1, 4) = "http"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().href.match(/doi\/[^/]*\/([^&]*)/)[1];
  2672.         Zotero.Utilities.HTTP.doGet(''http://www.blackwell-synergy.com/action/downloadCitation?doi='' + doi + ''&include=cit&format=refman&direct=on&submit=Download+references'', function(text) {
  2673.             var translator = Zotero.loadTranslator("import");
  2674.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  2675.             translator.setString(text);
  2676.             translator.setHandler("itemDone", function(obj, item) {
  2677.                 item.attachments = [
  2678.                     {url:item.url, title:"Blackwell Compass Snapshot", mimeType:"text/html"},
  2679.                     {url:item.url.replace("/doi/abs", "/doi/pdf"), title:"Blackwell Compass Full Text PDF", mimeType:"application/pdf"}
  2680.                 ];
  2681.                 
  2682.                 item.complete();
  2683.         
  2684.             });
  2685.             
  2686.             translator.translate();
  2687.         });
  2688.     }, function() {Zotero.done;});
  2689.     Zotero.wait();
  2690. }');
  2691.  
  2692. REPLACE INTO translators VALUES ('ca6e95d1-46b9-4535-885c-df0c2d4b7f7a', '1.0.0b4.r5', '', '2008-01-07 19:00:00', '0', '100', '4', 'Innovate Online', 'Michael Berkowitz', '^http://(www.)?innovateonline.info/', 
  2693. 'function detectWeb(doc, url) {
  2694.     if (url.indexOf("view=article") != -1) {
  2695.         return "journalArticle";
  2696.     } else if (url.indexOf("view=search") != -1) {
  2697.         return "multiple";
  2698.     }
  2699. }', 
  2700. 'function doWeb(doc, url) {
  2701.     var namespace = doc.documentElement.namespaceURI;
  2702.     var nsResolver = namespace ? function(prefix) {
  2703.         if (prefix == ''x'') return namespace; else return null;
  2704.     } : null;
  2705.     var newURIs = new Array();
  2706.     
  2707.     if (url.indexOf("view=search") != -1) {
  2708.         var titles = new Array();
  2709.         var hrefs = new Array();
  2710.         var items = new Object();
  2711.         var xpath = ''//ul[@class="articles"]/li[@class="result"]/div[@class="header"]'';
  2712.         var names = doc.evaluate(xpath, doc, namespace, XPathResult.ANY_TYPE, null);
  2713.         var next_item = names.iterateNext();
  2714.         while (next_item) {
  2715.             titles.push(next_item.textContent.split(/\n/)[3]);
  2716.             next_item = names.iterateNext();
  2717.         }
  2718.         
  2719.         var nextpath = ''//ul[@class="articles"]/li/@onclick'';
  2720.         var links = doc.evaluate(nextpath, doc, namespace, XPathResult.ANY_TYPE, null);
  2721.         var next_link = links.iterateNext();
  2722.         while (next_link) {
  2723.             hrefs.push(next_link.textContent);
  2724.             next_link = links.iterateNext();
  2725.         }
  2726.     
  2727.         for (var i = 0 ; i < titles.length ; i++) {
  2728.             items[hrefs[i].match(/\d+/)] = titles[i];
  2729.         }
  2730.         items = Zotero.selectItems(items);
  2731.         
  2732.         for (var i in items) {
  2733.             newURIs.push(''http://innovateonline.info/index.php?view=article&id='' + i);
  2734.         }
  2735.     } else {
  2736.         var newURL = url;
  2737.         if (newURL.indexOf("highlight") != -1) {
  2738.             newURL = newURL.substring(0, newURL.indexOf("highlight") -1);
  2739.         }
  2740.         if (newURL.indexOf("action=synopsis") != -1) {
  2741.             newURL = newURL.replace("action=synopsis", "action=article");
  2742.         }
  2743.         newURIs.push(newURL);
  2744.     }
  2745.     Zotero.debug(newURIs);
  2746.     
  2747.     Zotero.Utilities.processDocuments(newURIs, function(newDoc) {
  2748.         var newItem = new Zotero.Item("journalArticle");
  2749.         newItem.repository = "Innovate Online";
  2750.         newItem.publicationTitle = "Innovate";
  2751.         newItem.title = newDoc.title.substring(10);
  2752.         
  2753.         var authors = newDoc.evaluate(''//div[@id="title"]/div[@class="author"]/a'', newDoc, namespace, XPathResult.ANY_TYPE, null);
  2754.         var author = authors.iterateNext();
  2755.         while (author) {
  2756.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author.textContent, "author"));
  2757.             author = authors.iterateNext();
  2758.         }
  2759.         
  2760.         newItem.date = newDoc.evaluate(''//div[@id="page"]/a/div[@class="title"]'', newDoc, namespace, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  2761.         
  2762.         var voliss = newDoc.evaluate(''//div[@id="page"]/a/div[@class="subtitle"]'', newDoc, namespace, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/Volume\s+(\d+).*Issue\s+(\d+)/);
  2763.         newItem.volume = voliss[1];
  2764.         newItem.issue = voliss[2];
  2765.         
  2766.         var id = newDoc.location.href.match(/\d+/)[0];
  2767.         var PDFurl = "http://innovateonline.info/print.php?view=pdf&id=" + id;
  2768.         newItem.attachments = [
  2769.             {url:newDoc.location.href, title:"Innovate Online Snapshot", mimeType:"text/html"},
  2770.             {url:PDFurl, title:"Innovate Online PDF", mimeType:"application/pdf"}
  2771.         ]
  2772.         
  2773.         Zotero.Utilities.HTTP.doGet(newDoc.location.href.replace("action=article", "action=synopsis"), function(text) {
  2774.             var abs = text.match(/<div id=\"synopsis\">\n<p>(.*)<\/p>/)[1];
  2775.             newItem.abstractNote = Zotero.Utilities.unescapeHTML(Zotero.Utilities.cleanTags(abs));
  2776.             newItem.complete();
  2777.         });
  2778.     }, function() {Zotero.done;});
  2779.     Zotero.wait();
  2780. }');
  2781.  
  2782. REPLACE INTO translators VALUES ('bdae838b-3a58-461f-9e8a-142ed9de61dc', '1.0.0b4.r5', '', '2008-01-10 21:00:00', '1', '100', '4', 'PLoS Journals', 'Michael Berkowitz', 'http://[^.]+\.plosjournals\.org/', 
  2783. 'function detectWeb(doc, url)    {
  2784.     if (doc.evaluate(''//div[@class="search"][@id="browseResults"]/ul/li/span/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext() ||
  2785.         doc.evaluate(''//div[@id="toclist"]/dl/dt/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2786.         return "multiple";
  2787.     } else if (url.indexOf("get-document") != -1) {
  2788.         return "journalArticle";
  2789.     }
  2790. }', 
  2791. 'function unescape(text)    {
  2792.     var specialreg=new RegExp("&#[^;]+;");
  2793.     var specials=specialreg.exec(text);
  2794.     while(specials)    {
  2795.         text=text.replace(specials[0], String.fromCharCode(parseInt(specials[0].substring(2, specials[0].length-1), 10)));
  2796.         specials=specialreg.exec(text);
  2797.     }
  2798.     return text;
  2799. }
  2800.  
  2801. function doWeb(doc, url) {
  2802.     var URLs = new Array();
  2803.     var items = new Object();
  2804.     if (detectWeb(doc, url) == "multiple") {
  2805.         if (doc.evaluate(''//div[@class="search"][@id="browseResults"]/ul/li/span/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2806.             var xpath = ''//div[@class="search"][@id="browseResults"]/ul/li/span/a'';
  2807.         } else if (doc.evaluate(''//div[@id="toclist"]/dl/dt/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  2808.             var xpath = ''//div[@id="toclist"]/dl/dt/a'';
  2809.         }
  2810.         var articles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  2811.         var next_article = articles.iterateNext();
  2812.         while (next_article) {
  2813.             items[next_article.href] = Zotero.Utilities.cleanString(next_article.textContent);
  2814.             next_article = articles.iterateNext();
  2815.         }
  2816.         items = Zotero.selectItems(items);
  2817.         
  2818.         if (!items) {
  2819.             return true;
  2820.         }
  2821.         
  2822.         for (var i in items) {
  2823.             URLs.push(i);
  2824.         }
  2825.     } else {
  2826.         URLs.push(url);
  2827.     }
  2828.     
  2829.     
  2830.     Zotero.Utilities.processDocuments(URLs, function(doc, url) {
  2831.         var bits = doc.location.href.match(/(^.*\?request=).*(doi=.*$)/);
  2832.         var RISurl = bits[1] + ''download-citation&t=refman&'' + bits[2];
  2833.         Zotero.Utilities.HTTP.doGet(RISurl, function(text) {
  2834.             var trans=Zotero.loadTranslator("import");
  2835.             trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  2836.             trans.setString(text);
  2837.             trans.setHandler("itemDone", function(obj, newItem)    {
  2838.                 var urlstring= bits[1]+ ''get-pdf&'' +bits[2].replace("doi=", "file=").replace("/", "_").replace("%2F", "_") + ''-S.pdf'';
  2839.                 newItem.attachments.push({url:urlstring, title:newItem.title, mimeType:"application/pdf"});
  2840.                 
  2841.                 var urlRE = /http:\/\/dx.doi.org\/(.*)$/;
  2842.                 if (newItem.url) {
  2843.                     newItem.DOI = newItem.url.match(urlRE)[1].replace("%2F", "/");
  2844.                 }
  2845.                 
  2846.                 newItem.complete();
  2847.             });
  2848.             trans.translate();
  2849.             Zotero.done();
  2850.         });
  2851.         Zotero.wait();
  2852.     }, function() {Zotero.done;});
  2853.     
  2854.     Zotero.wait();
  2855. }');
  2856.  
  2857. REPLACE INTO translators VALUES ('9575e804-219e-4cd6-813d-9b690cbfc0fc', '1.0.0b4.r5', '', '2007-11-14 20:45:00', '0', '100', '4', 'PLoS One and PLoS Neglected Tropical Diseases', 'Michael Berkowitz', '^http://www\.(plosone|plosntds)\.org/(search|article)/', 
  2858. 'function detectWeb(doc, url) {
  2859.     if (url.indexOf("Search.action") != -1 || url.indexOf("browse.action") != -1) {
  2860.         return "multiple";
  2861.     } else if (url.indexOf("article") != -1) {
  2862.         return "journalArticle";
  2863.     }
  2864. }', 
  2865. 'function doWeb(doc, url) {
  2866.     var items = new Object();
  2867.     var texts = new Array();
  2868.     if (url.indexOf("Search.action") != -1 || url.indexOf("browse.action") != -1) {
  2869.         var articlex = ''//span[@class="article"]/a'';
  2870.         var articles = doc.evaluate(articlex, doc, null, XPathResult.ANY_TYPE, null);
  2871.         var next_art = articles.iterateNext();
  2872.         while (next_art) {
  2873.             items[next_art.href] = next_art.textContent;
  2874.             next_art = articles.iterateNext();
  2875.         }
  2876.         
  2877.         items = Zotero.selectItems(items);
  2878.         for (var i in items) {
  2879.             texts.push(i);
  2880.         }
  2881.     } else {
  2882.         texts.push(url);
  2883.     }
  2884.     
  2885.     Zotero.debug(texts);
  2886.     
  2887.     Zotero.Utilities.processDocuments(texts, function(doc, url) {
  2888.         var newURL = doc.location.href.replace("info", "getRisCitation.action?articleURI=info");
  2889.         var pdfURL = doc.location.href.replace("info", "fetchObjectAttachment.action?uri=info") + ''&representation=PDF'';
  2890.         Zotero.debug(newURL);
  2891.         Zotero.Utilities.HTTP.doGet(newURL, function(text) {
  2892.             var translator = Zotero.loadTranslator("import");
  2893.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  2894.             translator.setString(text);
  2895.             translator.setHandler("itemDone", function(obj, item) {
  2896.                 item.attachments.push({url:pdfURL, title:"PLoS One Full Text PDF", mimeType:"application/pdf"});
  2897.                 item.complete();
  2898.             });
  2899.             translator.translate();
  2900.             Zotero.done();
  2901.         });
  2902.         
  2903.     }, function() {Zotero.done()});
  2904. }');
  2905.  
  2906. REPLACE INTO translators VALUES ('b86bb082-6310-4772-a93c-913eaa3dfa1b', '1.0.0b4.r5', '', '2007-09-24 17:35:00', '0', '100', '4', 'Early English Books Online', 'Michael Berkowitz', '^http://eebo.chadwyck.com/search', 
  2907. 'function detectWeb(doc, url) {
  2908.     if (doc.title == "Search Results - EEBO") {
  2909.         return "multiple";
  2910.     } else if (doc.title != "Basic Search - EEBO") {
  2911.         return "book";
  2912.     }
  2913. }', 
  2914. 'function doWeb(doc, url) {
  2915.     var eeboIDs = new Array();
  2916.     if (doc.title == "Search Results - EEBO") {
  2917.         var items = new Object();
  2918.         Zotero.debug("search page");
  2919.         var IDxpath = ''//td[4]/script'';
  2920.         var Titlexpath = ''//td[3]/i'';
  2921.         var new_ids = doc.evaluate(IDxpath, doc, null, XPathResult.ANY_TYPE, null);
  2922.         var new_titles = doc.evaluate(Titlexpath, doc, null, XPathResult.ANY_TYPE, null);
  2923.         var next_id = new_ids.iterateNext();
  2924.         var next_title = new_titles.iterateNext();
  2925.         var IDRegex = /''(\d+)''/;
  2926.         while (next_id) {
  2927.             items[next_id.textContent.match(IDRegex)[1]] = next_title.textContent;
  2928.             next_id = new_ids.iterateNext();
  2929.             next_title = new_titles.iterateNext();
  2930.         }
  2931.         items = Zotero.selectItems(items);
  2932.         for (var i in items) {
  2933.             eeboIDs.push(i);
  2934.         }
  2935.     } else {
  2936.         var IDRegex = /&ID=(\w+)&/
  2937.         var eeboid = url.match(IDRegex)[1];
  2938.         if (eeboid[0] == "D") {
  2939.             eeboid = eeboid.slice(7, 14);
  2940.         }
  2941.         eeboIDs.push(eeboid);
  2942.     }
  2943.     Zotero.debug(eeboIDs);
  2944.     for (var i = 0 ; i < eeboIDs.length ; i++) {
  2945.         var postString = ''cit_format=RIS&Print=Print&cit_eeboid='' + eeboIDs[i] + ''&EeboId='' + eeboIDs[i];
  2946.         var new_eeboid = eeboIDs[i]
  2947.         Zotero.Utilities.HTTP.doPost(''http://eebo.chadwyck.com/search/print'', postString, function(text) {
  2948.             // load translator for RIS
  2949.             var translator = Zotero.loadTranslator("import");
  2950.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  2951.             translator.setString(text.substring(17));
  2952.             translator.setHandler("itemDone", function(obj, item) {
  2953.                 item.url = ''http://eebo.chadwyck.com/search/full_rec?SOURCE=pgimages.cfg&ACTION=ByID&ID='' + new_eeboid + ''&FILE=../session/1190302085_15129&SEARCHSCREEN=CITATIONS&SEARCHCONFIG=config.cfg&DISPLAY=ALPHA'';
  2954.                 item.complete();
  2955.             });
  2956.             translator.translate();
  2957.             Zotero.done();
  2958.         });
  2959.     }
  2960. }');
  2961.  
  2962. REPLACE INTO translators VALUES ('d9be934c-edb9-490c-a88d-34e2ee106cd7', '1.0.0b4.r5', '', '2007-07-31 16:45:00', '0', '100', '4', 'Time.com', 'Michael Berkowitz', '^http://www.time.com/time/', 
  2963. 'function detectWeb(doc, url) {
  2964.     if (doc.title == "TIME Magazine - Search Results") {
  2965.         return "multiple";
  2966.     } else {
  2967.         var namespace = doc.documentElement.namespaceURI;
  2968.         var nsResolver = namespace ? function(prefix) {
  2969.             if (prefix == "x") return namespace; else return null;
  2970.         } : null;
  2971.         
  2972.         var xpath = ''//meta[@name="byline"]'';
  2973.         var xpath2 = ''//div[@class="byline"]'';
  2974.         var xpath3 = ''//div[@class="copy"]/div[@class="byline"]'';
  2975.         if ((doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(xpath2, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(xpath3, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) ) {
  2976.             if (url.substr(-4,4) == "html") {
  2977.                 return "newspaperArticle";
  2978.             }
  2979.         }
  2980.     }
  2981. }
  2982. ', 
  2983. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  2984.     if (metaTags[field]) {
  2985.         newItem[zoteroField] = metaTags[field];
  2986.     }
  2987. }
  2988.  
  2989. function scrape(doc, url) {
  2990.     var newItem = new Zotero.Item("newspaperArticle");
  2991.     newItem.publicationTitle = "Time Magazine";
  2992.     newItem.ISSN = "0040-718X";
  2993.     newItem.url = doc.location.href;
  2994.     
  2995.     var metaTags = new Object();
  2996.     
  2997.     var metaTagHTML = doc.getElementsByTagName("meta")
  2998.     for (var i = 0 ; i < metaTagHTML.length ; i++) {
  2999.         metaTags[metaTagHTML[i].getAttribute("name")] = metaTagHTML[i].getAttribute("content");
  3000.     }
  3001.     
  3002.     if (metaTags["head"]) {
  3003.         associateMeta(newItem, metaTags, "head", "title");
  3004.     } else {
  3005.         newItem.title = doc.title.substr(0, doc.title.length - 7);
  3006.     }
  3007.     
  3008.     if (metaTags["description"]) {
  3009.         associateMeta(newItem, metaTags, "description", "abstractNote");
  3010.     }
  3011.     
  3012.      if (metaTags["date"]) {
  3013.          var date = metaTags["date"];
  3014.          var months = new Object();
  3015.              months["jan"] = "January";
  3016.              months["feb"] = "February";
  3017.              months["mar"] = "March";
  3018.              months["apr"] = "April";
  3019.              months["may"] = "May";
  3020.              months["jun"] = "June";
  3021.              months["jul"] = "July";
  3022.              months["aug"] = "August";
  3023.              months["sep"] = "September";
  3024.              months["oct"] = "October";
  3025.              months["nov"] = "November";
  3026.              months["dec"] = "December";
  3027.          date = date.split(".").join("").split(", ").slice(1);
  3028.          date[0] = months[date[0].split(" ")[0].toLowerCase()] + " " + date[0].split(" ")[1];
  3029.          newItem.date = date.join(", ");
  3030.      }
  3031.     if (metaTags["keywords"]) {
  3032.         newItem.tags = Zotero.Utilities.cleanString(metaTags["keywords"]).split(", ");
  3033.         for (var i in newItem.tags) {
  3034.             if (newItem.tags[i] == "" || newItem.tags[i] == " ") {
  3035.                 break;
  3036.             } else {
  3037.                 var words = newItem.tags[i].split(" ");
  3038.                 for (var j = 0 ; j < words.length ; j++) {
  3039.                     Zotero.debug(words[j]);
  3040.                     if (words[j][0] == words[j][0].toLowerCase() && words[j][0]) {
  3041.                         words[j] = words[j][0].toUpperCase() + words[j].substr(1).toLowerCase();
  3042.                     }
  3043.                 }
  3044.             } 
  3045.             newItem.tags[i] = words.join(" ");
  3046.         }
  3047.     }
  3048.     
  3049.     if (metaTags["byline"]) {
  3050.         var byline = Zotero.Utilities.cleanString(metaTags["byline"]);
  3051.         var byline1 = byline.split(" and ");
  3052.         for (var i = 0 ; i < byline1.length ; i++) {
  3053.             var byline2 = byline1[i].split("/");
  3054.             for (var j = 0 ; j < byline2.length ; j++) {
  3055.                 byline2[j] = Zotero.Utilities.cleanString(byline2[j]);
  3056.                 if (byline2[j].indexOf(" ") == -1) {
  3057.                     if (byline2[j].length == 2) {
  3058.                         newItem.extra = byline2[j];
  3059.                     } else {
  3060.                         newItem.extra = byline2[j][0].toUpperCase() + byline2[j].substr(1).toLowerCase();
  3061.                     }
  3062.                 } else {
  3063.                     byline3 = byline2[j].split(" ");
  3064.                     for (var x = 0 ; x < byline3.length ; x++) {
  3065.                         byline3[x] = byline3[x][0].toUpperCase() + byline3[x].substr(1).toLowerCase();
  3066.                     }
  3067.                     byline3 = byline3.join(" ");
  3068.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(byline3, "author"));
  3069.                 }
  3070.             }
  3071.         }
  3072.     }
  3073.     newItem.complete();
  3074. }
  3075.  
  3076.  
  3077. function doWeb(doc, url) {
  3078.     var namespace = doc.documentElement.namespaceURI;
  3079.     var nsResolver = namespace ? function(prefix) {
  3080.         if (prefix == "x") return namespace; else return null;
  3081.     } : null;
  3082.     
  3083.     var urls = new Array();
  3084.     if (doc.title == "TIME Magazine - Search Results") {
  3085.         var items = new Array();
  3086.         var items = Zotero.Utilities.getItemArray(doc, doc.getElementById("search_results").getElementsByTagName("h3"), ''^http://www.time.com/time/.*\.html$'');
  3087.         Zotero.debug(items);
  3088.  
  3089.         items = Zotero.selectItems(items);
  3090.     
  3091.         if (!items) {
  3092.             return true;
  3093.         }
  3094.         
  3095.         for (var i in items) {
  3096.             if (i.match("covers") == null) {
  3097.                 urls.push(i);
  3098.             }
  3099.         }
  3100.     } else if (doc.evaluate(''//meta[@name="byline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(''//div[@class="byline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() || doc.evaluate(''//div[@class="copy"]/div[@class="byline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) {
  3101.         urls.push(doc.location.href);
  3102.     }
  3103.     Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); } );
  3104.     
  3105.     Zotero.wait();
  3106. }');
  3107.  
  3108. REPLACE INTO translators VALUES ('b33bbb49-03d2-4175-91c4-3840501bc953', '1.0.0b4.r5', '', '2007-07-31 16:45:00', '1', '100', '4', 'Time-Blog.com', 'Michael Berkowitz', '^http://time-blog.com/', 
  3109. 'function detectWeb(doc, url) {
  3110.     if (url.substr(-4,4) == "html") {
  3111.         return "blogPost";
  3112.     } else {
  3113.         return "multiple";
  3114.     }
  3115. }', 
  3116. 'function scrape(doc, url) {
  3117.     var newItem = new Zotero.Item("blogPost");
  3118.     
  3119.     newItem.url = doc.location.href;
  3120.     newItem.title = doc.title.substr(0, doc.title.indexOf(" - "));
  3121.     
  3122.     var titleRE = new RegExp(''^http://time-blog.com/([^/]*)/'');
  3123.     var title = titleRE.exec(doc.location.href)[1].split("_");
  3124.     for (var i = 0 ; i < title.length ; i++) {
  3125.         title[i] = title[i][0].toUpperCase() + title[i].substr(1).toLowerCase();
  3126.     }
  3127.     newItem.blogTitle = title.join(" ");
  3128.     var metaTags = new Object();
  3129.     
  3130.     var metaTagHTML = doc.getElementsByTagName("meta");
  3131.     for (var i = 0 ; i < metaTagHTML.length ; i++) {
  3132.         metaTags[metaTagHTML[i].getAttribute("name")] = metaTagHTML[i].getAttribute("content");
  3133.     }
  3134.     
  3135.     if (metaTags["description"]) {
  3136.         newItem.abstractNote = Zotero.Utilities.cleanString(Zotero.Utilities.cleanTags(metaTags["description"]));
  3137.     }
  3138.     
  3139.     if (metaTags["date"]) {
  3140.          var date = metaTags["date"];
  3141.          var months = new Object();
  3142.              months["jan"] = "January";
  3143.              months["feb"] = "February";
  3144.              months["mar"] = "March";
  3145.              months["apr"] = "April";
  3146.              months["may"] = "May";
  3147.              months["jun"] = "June";
  3148.              months["jul"] = "July";
  3149.              months["aug"] = "August";
  3150.              months["sep"] = "September";
  3151.              months["oct"] = "October";
  3152.              months["nov"] = "November";
  3153.              months["dec"] = "December";
  3154.          date = date.split(".").join("").split(", ");
  3155.          date[0] = months[date[0].split(" ")[0].toLowerCase()] + " " + date[0].split(" ")[1];
  3156.          newItem.date = date.join(", ");
  3157.      }
  3158.      
  3159.      if (metaTags["keywords"]) {
  3160.         newItem.tags = metaTags["keywords"].split(", ");
  3161.         for (var i in newItem.tags) {
  3162.             if (newItem.tags[i] == "" || newItem.tags[i] == " ") {
  3163.                 break;
  3164.             } else {
  3165.                 var words = newItem.tags[i].split(" ");
  3166.                 for (var j = 0 ; j < words.length ; j++) {
  3167.                     if (words[j][0] == words[j][0].toLowerCase() && words[j][0]) {
  3168.                         words[j] = words[j][0].toUpperCase() + words[j].substr(1).toLowerCase();
  3169.                     }
  3170.                 }
  3171.             } 
  3172.             newItem.tags[i] = words.join(" ");
  3173.         }
  3174.     }
  3175.     
  3176.     if (doc.evaluate(''//span[@class="postedby"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  3177.         var byline = Zotero.Utilities.cleanString(doc.evaluate(''//span[@class="postedby"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  3178.         if (byline.substr(0,9).toLowerCase() == "posted by") {
  3179.             byline = byline.substr(10).split(" ");
  3180.         } else {
  3181.             byline.split(" ");
  3182.         }
  3183.         for (var i = 0; i < byline.length ; i++) {
  3184.             byline[i] = byline[i][0].toUpperCase() + byline[i].substr(1).toLowerCase();
  3185.         }
  3186.         newItem.creators.push(Zotero.Utilities.cleanAuthor(byline.join(" "), "author"));
  3187.     } else if (newItem.blogTitle == "Theag") {
  3188.         newItem.creators.push(Zotero.Utilities.cleanAuthor("Matthew Yeomans", "author"));
  3189.         newItem.blogTitle = "the Aggregator";
  3190.     }
  3191.     
  3192.     Zotero.debug(newItem);
  3193.     
  3194.     newItem.complete();
  3195.     
  3196. }
  3197.  
  3198. function doWeb(doc, url) {
  3199.  
  3200.     var namespace = doc.documentElement.namespaceURI;
  3201.     var nsResolver = namespace ? function(prefix) {
  3202.         if (prefix == "x") return namespace; else return null;
  3203.     } : null;
  3204.     
  3205.     var URIS = new Array();
  3206.     
  3207.     var xpath = ''//h1[@class="entryTitle"]/a'';
  3208.     var articles = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  3209.     var art = articles.iterateNext();
  3210.     var arts = new Array();
  3211.     var urls = new Array();
  3212.     while (art) {
  3213.          arts.push(art.textContent);
  3214.          urls.push(art.href);
  3215.          art = articles.iterateNext();
  3216.     }
  3217.     if (arts.length > 1) {
  3218.         var items = new Object;
  3219.         for (var i  = 0; i < arts.length ; i++ ) {
  3220.             items[urls[i]] = arts[i];
  3221.         }
  3222.         items = Zotero.selectItems(items);
  3223.     
  3224.         for (i in items) {
  3225.             URIS.push(i);
  3226.         }
  3227.     } else {
  3228.         URIS.push(url);
  3229.     }
  3230.     Zotero.Utilities.processDocuments(URIS, scrape, function() { Zotero.done(); } );
  3231.     
  3232.     Zotero.wait();
  3233. }');
  3234.  
  3235. REPLACE INTO translators VALUES ('9346ddef-126b-47ec-afef-8809ed1972ab', '1.0.0b4.r5', '', '2007-07-31 16:45:00', '1', '99', '4', 'Institute of Physics', 'Michael Berkowitz', '^http://www.iop.org/EJ/(toc|abstract|search)', 
  3236. 'function detectWeb(doc, url) {
  3237.     if ((doc.location.href.indexOf("toc") == -1) && (doc.location.href.indexOf("search") == -1)) {
  3238.         Zotero.debug("journalArticle");
  3239.         return "journalArticle";
  3240.     } else {
  3241.         Zotero.debug("multiple");
  3242.         return "multiple";
  3243.     }
  3244. }', 
  3245. 'function parseRIS(getURL, pdfURL) {   
  3246.     Zotero.Utilities.HTTP.doGet(getURL, function(text){
  3247.         // load translator for RIS
  3248.         var translator = Zotero.loadTranslator ("import");
  3249.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  3250.         translator.setString(text);
  3251.         translator.setHandler("itemDone", function(obj, item) { 
  3252.         item.attachments = [
  3253.                 {url:pdfURL, title:"IOP Full Text PDF", mimeType:"application/pdf"}
  3254.             ];
  3255.             item.complete();
  3256.     });
  3257.     translator.translate();
  3258.         Zotero.done();
  3259.     }, function() {}); 
  3260.  
  3261.     Zotero.wait();
  3262. }
  3263.  
  3264.  
  3265. function doWeb(doc, url) {
  3266.     var namespace = doc.documentElement.namespaceURI;
  3267.     var nsResolver = namespace ? function(prefix) {
  3268.         if (prefix == "x" ) return namespace; else return null; 
  3269.     } : null;
  3270.     
  3271.     var xpath = ''//td[1][@id="toc-opts-left"]/span[@class="toclink"]/a[contains(text(), "Abstract")]'';
  3272.     var PDFs = new Array();
  3273.     var urls = new Array();
  3274.     var pdfurls = new Array();
  3275.     var items = new Array();
  3276.     
  3277.     if (doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  3278.         var links = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  3279.         var url = links.iterateNext();
  3280.         while (url) {
  3281.             items.push(url.href);
  3282.     url = links.iterateNext ();
  3283.         }
  3284.         
  3285.         var titles = new Array();
  3286.         var xpath2 = ''//strong[@class="tocTitle"]'';
  3287.     var stuff = doc.evaluate(xpath2, doc, nsResolver, XPathResult.ANY_TYPE, null);
  3288.     var title = stuff.iterateNext();
  3289.     while (title) {
  3290.         titles.push(title.textContent);
  3291.         title = stuff.iterateNext();
  3292.     }
  3293.         
  3294.         var xpath3 = ''//table/tbody/tr/td[2]/span[@class="toclink"]/a'';
  3295.         var PDFlinks = doc.evaluate(xpath3, doc, nsResolver, XPathResult.ANY_TYPE, null);
  3296.         var newPDF = PDFlinks.iterateNext();
  3297.         while (newPDF) {
  3298.             PDFs.push(newPDF.href);
  3299.             newPDF = PDFlinks.iterateNext();
  3300.         }
  3301.         
  3302.         var newItems = new Object();
  3303.         
  3304.         Zotero.debug(items.length);
  3305.         Zotero.debug(titles.length);
  3306.         for (var x = 0 ; x < items.length ; x++) {
  3307.             newItems[items[x]] = [titles[x], PDFs[x]];
  3308.         }
  3309.         
  3310.         
  3311.         Zotero.debug(newItems); 
  3312.         
  3313.         
  3314.         newItems = Zotero.selectItems(newItems);
  3315.  
  3316.         if (!newItems) {
  3317.             return true;
  3318.         }
  3319.         
  3320.         for (var i in newItems) {
  3321.             Zotero.debug(i);
  3322.             urls.push (i);
  3323.             var newStuff = newItems[i].split('','');
  3324.             pdfurls.push(Zotero.Utilities.cleanString(newStuff[newStuff.length - 1]));
  3325.         }
  3326.         
  3327.     } else {
  3328.         urls.push(doc.location.href);
  3329.         var xpath4 = ''//div[@id="abstract"]//td[2]/a'';
  3330.         pdfurls.push(doc.evaluate(xpath4, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href);
  3331.     }
  3332.     
  3333.     for (var i = 0 ; i < urls.length ; i++) {
  3334.         urls[i] = urls[i].replace("abstract", "sview"); 
  3335.     }
  3336.     
  3337.     Zotero.debug(urls);
  3338.     Zotero.debug(pdfurls);
  3339.     Zotero.Utilities.HTTP.doPost(urls, "format=refmgr&submit=1", function(text) {
  3340.         for (var j = 0 ; j < urls.length ; j++) {
  3341.             parseRIS(urls[j] + "?format=refmgr&submit=1", pdfurls[j]); 
  3342.         }
  3343.     });
  3344.     
  3345.     Zotero.wait();
  3346. }
  3347.  
  3348. ');
  3349.  
  3350. REPLACE INTO translators VALUES ('6ec8008d-b206-4a4c-8d0a-8ef33807703b', '1.0.0b4.r5', '', '2007-08-27 02:00:00', '1', '100', '4', 'The Economist', 'Michael Berkowitz', '^http://(www.)?economist.com/', 
  3351. 'function detectWeb(doc, url) {
  3352.        if (doc.location.href.indexOf("search") != -1) {
  3353.                return "multiple";
  3354.        } else if (doc.location.href.toLowerCase().indexOf("displaystory") != -1 || doc.location.href.indexOf("cityPage") != -1) {
  3355.                return "magazineArticle";
  3356.        }
  3357. }', 
  3358. 'function scrape(doc, url) {
  3359.        var namespace = doc.documentElement.namespaceURI;
  3360.        var nsResolver = namespace ? function(prefix) {
  3361.                if (prefix == "x" ) return namespace; else return null;
  3362.        } : null;
  3363.  
  3364.        newItem = new Zotero.Item("magazineArticle");
  3365.        newItem.ISSN = "0013-0613";
  3366.        newItem.url = doc.location.href;
  3367.        newItem.publicationTitle = "The Economist";
  3368.  
  3369.  
  3370.        //get headline
  3371.        var title = new Array();
  3372.        if (doc.title && doc.title != "" && doc.title != "Economist.com") {
  3373.                title = doc.title.split(" | ");
  3374.        } else {
  3375.         title.push(doc.evaluate(''//div[@class="clear"][@id="pay-barrier"]/div[@class="col-left"]/div[@class="article"]/font/b'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  3376.        }
  3377.  
  3378.  
  3379.        if (title.length == 1) {
  3380.                title.push = title;
  3381.        } else {
  3382.                title = title.slice(0, title.length - 1);
  3383.                title = title.join(": ");
  3384.        }
  3385.        newItem.title = title;
  3386.  
  3387.        if (doc.evaluate(''//div[@class="clear"][@id="pay-barrier"]/div[@class="col-right"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) {
  3388.                newItem.extra =  "(Subscription only)";
  3389.        }
  3390.  
  3391.        //get abstract
  3392.        if (doc.evaluate(''//div[@id="content"]/div[@class="clear top-border"]/div[@class="col-left"]/h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) {
  3393.                newItem.abstractNote = doc.evaluate(''//div[@id="content"]/div[@class="clear top-border"]/div[@class="col-left"]/h2'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  3394.        } else if (doc.evaluate(''//div[@class="clear"][@id="pay-barrier"]/div[@class="col-left"]/div[@class="article"]/p/strong'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) {
  3395.                newItem.abstractNote = doc.evaluate(''//div[@class="clear"][@id="pay-barrier"]/div[@class="col-left"]/div[@class="article"]/p/strong'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  3396.        }
  3397.        
  3398.        if (newItem.abstractNote[newItem.abstractNote.length - 1] != ".") {
  3399.            newItem.abstractNote += ".";
  3400.        }
  3401.  
  3402.        //get date and extra stuff
  3403.        if (doc.evaluate(''//div[@class="col-left"]/p[@class="info"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext() ) {
  3404.                newItem.date = doc.evaluate(''//div[@class="col-left"]/p[@class="info"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.substr(0,13);
  3405.        }
  3406.     
  3407.     var url = doc.location.href;
  3408.        newItem.attachments = [
  3409.                {url:url.replace("displaystory", "PrinterFriendly"), title:"The Economist Snapshot", mimeType:"text/html"}
  3410.            ];
  3411.            
  3412.        newItem.complete();
  3413. }
  3414.  
  3415.  
  3416. function doWeb(doc, url) {
  3417.        var namespace = doc.documentElement.namespaceURI;
  3418.        var nsResolver = namespace ? function(prefix) {
  3419.                if (prefix == "x" ) return namespace; else return null;
  3420.        } : null;
  3421.  
  3422.        var urls = new Array();
  3423.  
  3424.        if (doc.title == "Search | Economist.com") {
  3425.                var items = new Array();
  3426.                var uris = new Array();
  3427.                var results = doc.evaluate(''//ol[@class="search-results"]/li/h2/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3428.                var headline = results.iterateNext();
  3429.                while (headline) {
  3430.                        items.push(headline.textContent);
  3431.                        uris.push(headline.href);
  3432.                        headline = results.iterateNext();
  3433.                }
  3434.  
  3435.                var newItems = new Object();
  3436.                for (var i = 0 ; i <items.length ; i++) {
  3437.                        newItems[items[i]] = uris[i];
  3438.                }
  3439.                var newItems  = Zotero.Utilities.getItemArray(doc, doc, ''^http://(www.)*economist.com/(.*/)*(displaystory.cfm|cityPage.cfm)'');
  3440.                newItems = Zotero.selectItems(newItems);
  3441.                if (!newItems) {
  3442.                        return true;
  3443.                }
  3444.  
  3445.                for (var i in newItems) {
  3446.                        urls.push(i);
  3447.                }
  3448.        } else if (doc.location.href.toLowerCase().indexOf("displaystory") != -1) {
  3449.                urls.push(url);
  3450.        }
  3451.        
  3452.        Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  3453.        
  3454.        Zotero.wait();
  3455.  
  3456. }');
  3457.  
  3458. REPLACE INTO translators VALUES ('84bd421d-c6d1-4223-ab80-a156f98a8e30', '1.0.0b4.r1', '', '2007-07-31 16:45:00', '0', '100', '4', 'International Herald Tribune', 'Michael Berkowitz', '^http://(www.)?iht.com/',
  3459. 'function detectWeb(doc, url) {
  3460.     if (doc.title == "Search - International Herald Tribune" && doc.location.href != "http://www.iht.com/info/nytarchive.php") {
  3461.         return "multiple";
  3462.     } else {
  3463.         var namespace = doc.documentElement.namespaceURI;
  3464.         var nsResolver = namespace ? function(prefix) {
  3465.             if (prefix == "x") return namespace; else return null;
  3466.         } : null;
  3467.         
  3468.         var xpath = ''//meta[@name="Headline"]'';
  3469.         if (doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  3470.             return "newspaperArticle";
  3471.         }
  3472.     }
  3473. }',
  3474. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  3475.     if(metaTags[field]) {
  3476.         newItem[zoteroField] = metaTags[field];
  3477.     }
  3478. }
  3479.  
  3480. function scrape(doc, url) {
  3481.     var newItem = new Zotero.Item("newspaperArticle");
  3482.     newItem.publicationTitle = "The International Herald Tribune";
  3483.     newItem.ISSN = "0294-8052";
  3484.     newItem.url = doc.location.href;
  3485.     
  3486.     var metaTags = new Object();
  3487.     
  3488.     var metaTagHTML = doc.getElementsByTagName("meta");
  3489.     for (var i = 0 ; i < metaTagHTML.length ; i++) {
  3490.         metaTags[metaTagHTML[i].getAttribute("name")] = Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content"));
  3491.     }
  3492.  
  3493.     associateMeta(newItem, metaTags, "Headline", "title");
  3494.     associateMeta(newItem, metaTags, "PrintPubDate", "date");
  3495.     associateMeta(newItem, metaTags, "Summary", "abstractNote");
  3496.     associateMeta(newItem, metaTags, "ArticleID", "accessionNumber");
  3497.     associateMeta(newItem, metaTags, "Owner", "extra");
  3498.     
  3499.     if (metaTags["Author"]) {
  3500.         var author = Zotero.Utilities.cleanString(metaTags["Author"]);
  3501.         if (author.substr(0,3).toLowerCase() == "by ") {
  3502.             author = author.substr(3);
  3503.         }
  3504.         
  3505.         var authors = author.split(" and ");
  3506.         for each(var author in authors) {
  3507.             var words = author.split(" ");
  3508.             for (var i in words) {
  3509.                 words[i] = words[i][0].toUpperCase() + words[i].substr(1).toLowerCase();
  3510.             }
  3511.             author = words.join(" ");
  3512.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  3513.         }
  3514.     }
  3515.     
  3516.     if (metaTags["keywords"]) {
  3517.         var keywords = metaTags["keywords"];
  3518.         newItem.tags = keywords.split(",");
  3519.         if (newItem.tags[0].toLowerCase()) {
  3520.             newItem.tags = newItem.tags.slice(1, newItem.tags.length);
  3521.         }
  3522.         Zotero.debug(newItem.tags);
  3523.         for (var i in newItem.tags) {
  3524.             if (newItem.tags[i] != "") {
  3525.                 newItem.tags[i] = Zotero.Utilities.cleanString(newItem.tags[i].replace("  ", ", "));
  3526.                 var words = newItem.tags[i].split(" ");
  3527.                 for (var j = 0 ; j < words.length ; j++) {
  3528.                     if (words[j][0] == words[j][0].toLowerCase()) {
  3529.                         words[j] = words[j][0].toUpperCase() + words[j].substr(1).toLowerCase();
  3530.                     }
  3531.                 }
  3532.                 newItem.tags[i] = words.join(" ");
  3533.             }
  3534.         }
  3535.     }
  3536.     
  3537.     newItem.complete();
  3538. }
  3539.  
  3540. function doWeb(doc, url) {
  3541.     var namespace = doc.documentElement.namespaceURI;
  3542.     var nsResolver = namespace ? function(prefix) {
  3543.         if (prefix == "x" ) return namespace; else return null;
  3544.     } : null;
  3545.     
  3546.     var uris = new Array();
  3547.     if (doc.title == "Search - International Herald Tribune") {
  3548.         var result = doc.evaluate(''//td[@class="searchheadline"]/a'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  3549.         var items = new Array();
  3550.         var elmt = result.iterateNext();
  3551.         while (elmt) {
  3552.             items.push(elmt.href);
  3553.             elmt = result.iterateNext();
  3554.         }
  3555.         var items = Zotero.Utilities.getItemArray(doc, doc, ''^http://(www.)*iht.com/articles/.*\.php$'');
  3556.         items = Zotero.selectItems(items);
  3557.         
  3558.         if (!items) {
  3559.             return true;
  3560.         }
  3561.         
  3562.         for (var i in items) {
  3563.             uris.push(i);
  3564.         }
  3565.         
  3566.     } else if (doc.evaluate(''//meta[@name="Headline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  3567.         uris.push(url);
  3568.     }
  3569.         
  3570.     Zotero.Utilities.processDocuments(uris, scrape, function() { Zotero.done(); });
  3571.     
  3572.     Zotero.wait();
  3573. }
  3574. ');
  3575.  
  3576. REPLACE INTO translators VALUES ('631ff0c7-2e64-4279-a9c9-ad9518d40f2b', '1.0.0b4.r5', '', '2007-08-14 22:15:00', '0', '100', '4', 'Stuff.co.nz', 'Michael Berkowitz', '^http://(www.)?stuff.co.nz/', 
  3577. 'function detectWeb(doc, url) {
  3578.     if ((doc.location.href.indexOf("search-results") != -1) || (doc.location.href.indexOf("/blogs/blogs/") != -1 )) {
  3579.         return "multiple";
  3580.     } else if ((doc.location.href.indexOf("blogs") != -1) && (url != "http://www.stuff.co.nz/blogs/blogs") && (url != "http://stuff.co.nz/blogs/blogs")) {
  3581.         return "blogPost";
  3582.     } else if (doc.location.href.indexOf("html") == (doc.location.href.length - 4)){
  3583.         return "newspaperArticle";
  3584.     }
  3585. }', 
  3586. 'function scrape(doc, url) {
  3587.     if (doc.location.href.indexOf("html") != -1) {
  3588.         var newItem = new Zotero.Item("newspaperArticle");
  3589.         newItem.url = doc.location.href;
  3590.         newItem.publicationTitle = "Stuff.co.nz";
  3591.         newItem.title = doc.title.split(" - ")[0];
  3592.         
  3593.         //abstract
  3594.         var xpath = ''//div[@id="leftcol_story"]/p/strong'';
  3595.         newItem.abstractNote = Zotero.Utilities.cleanString(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  3596.         
  3597.         //date and author
  3598.         var xpath = ''//div[@id="story_headline"]'';
  3599.         var info = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(/\n+/)[2].split(" | ");
  3600.         
  3601.         newItem.date = Zotero.Utilities.cleanString(info[1].split(",")[1]);
  3602.         
  3603.         var author = Zotero.Utilities.cleanString(info[0]);
  3604.         if (author.substr(0,2).toLowerCase() == "by") {
  3605.             author = author.substr(3);
  3606.             if (author.indexOf(" - ") != -1) {
  3607.                 author = author.split(" - ")[0].split(" ");
  3608.             } else {
  3609.                 author = author.split(" ");
  3610.             }
  3611.             for (var i = 0 ; i < author.length ; i++) {
  3612.                 author[i] = author[i][0] + author[i].substr(1).toLowerCase();
  3613.                 var creator = author.join(" ");
  3614.             }
  3615.             newItem.creators.push(Zotero.Utilities.cleanAuthor(creator, "author"));
  3616.         } else {
  3617.             newItem.extra = author;
  3618.         }
  3619.     } else if (doc.location.href.indexOf("blogs") != -1) {
  3620.         var newItem = new Zotero.Item("blogPost");
  3621.         newItem.url = doc.location.href;
  3622.  
  3623.         //post title
  3624.         var xpath = ''//div[@class="post"]/h2[@class="storytitle"]/a'';
  3625.         newItem.title = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  3626.     
  3627.         //date and author
  3628.         var xpath = ''//div[@class="meta"][@id="postdate"]''
  3629.         var info = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.split(" | ");
  3630.         var byline = Zotero.Utilities.cleanString(info[0]).split(" in ");
  3631.         newItem.creators.push(Zotero.Utilities.cleanAuthor(byline[0], "author"));
  3632.         newItem.blogTitle = byline[1];
  3633.         var date = Zotero.Utilities.cleanString(info[1]).split("m ");
  3634.         newItem.date = date[1];
  3635.     }
  3636.     newItem.complete();
  3637. }
  3638.  
  3639. function doWeb(doc, url) {
  3640.     var URLS = new Array();
  3641.     
  3642.     //multiple
  3643.     if ((url.indexOf("search-results") != -1) || (url.indexOf("blogs/blogs/") != -1)) {
  3644.         if (url.indexOf("search-results") != -1) {
  3645.             var xpath = ''//div[@id="leftcol_story"]/p/a'';
  3646.         } else if (url.indexOf("blogs/blogs/") != -1) {
  3647.             var xpath = ''//h2[@class="storytitle"]/a'';
  3648.         }
  3649.     
  3650.         var items = new Object();
  3651.         var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  3652.         var newTitle = titles.iterateNext();
  3653.         while (newTitle) {
  3654.             items[newTitle.href] = newTitle.textContent;
  3655.             newTitle = titles.iterateNext();
  3656.         }
  3657.         
  3658.         items = Zotero.selectItems(items);
  3659.         
  3660.         for (var i in items) {
  3661.             URLS.push(i);
  3662.         }
  3663.     } else {
  3664.         URLS.push(url);
  3665.     }
  3666.     
  3667.     Zotero.Utilities.processDocuments(URLS, scrape, function() {Zotero.done();});
  3668.     Zotero.wait();
  3669. }');
  3670.  
  3671. REPLACE INTO translators VALUES ('efb3c424-daa9-40c9-8ee2-983d2802b27a', '1.0.0b4.r5', '', '2007-08-14 22:15:00', '0', '100', '4', 'The Age', 'Michael Berkowitz', '^http://(www|search).theage.com.au/', 
  3672. 'function detectWeb(doc, url) {
  3673.     if (url.indexOf("siteSearch.ac") != -1) {
  3674.         return "multiple";
  3675.     } else if (url.indexOf("html") != -1) {
  3676.         return "newspaperArticle";
  3677.     }
  3678. }', 
  3679. 'function scrape(url) {
  3680.     Zotero.Utilities.HTTP.doGet(url, function(text) {
  3681.         var newItem = new Zotero.Item("newspaperArticle");
  3682.         newItem.ISSN = "0312-6307";
  3683.         newItem.url =url;
  3684.         newItem.publicationTitle = "The Age";
  3685.         Zotero.debug(url);
  3686.         
  3687.         //title
  3688.         var t = /<HEADLINE>(.*)<\/HEADLINE>/;
  3689.         newItem.title = Zotero.Utilities.unescapeHTML(Zotero.Utilities.capitalizeTitle(text.match(t)[1]).split(" - ")[0]);
  3690.         
  3691.         //meta tags? (except abstract, for some reason)
  3692.         var m = /name=\"(.*)\"\s+content=\"(.*)\"\s+\/>/g;
  3693.         var metaTags = text.match(m);
  3694.         var metaInfo = new Object();
  3695.         var metaNames = new Array();
  3696.         var m2 = /name=\"(.*)\"\s+content=\"(.*)\"\s+\/>/;
  3697.         for (var i = 0 ; i < metaTags.length ; i++) {
  3698.             var stuff = metaTags[i].match(m2);
  3699.             metaInfo[stuff[1]] = stuff[2];
  3700.             metaNames.push(stuff[1]);
  3701.         }
  3702.         
  3703.         for (var i = 0 ; i <metaNames.length ; i++) {
  3704.             if (metaNames[i] == "sitecategories") {
  3705.                 newItem.section = metaInfo[metaNames[i]].split(",")[0];
  3706.             } else if (metaNames[i] == "publishdate") {
  3707.                 newItem.date = metaInfo[metaNames[i]].split(/\s+/)[0];
  3708.             } else if (metaNames[i] == "byline") {
  3709.                 var byline = metaInfo[metaNames[i]].split(",")[0];
  3710.                 if (byline.indexOf(" and ") != -1) {
  3711.                     byline = byline.split(" and ");
  3712.                     for (var j = 0 ; j < byline.length ; j++) {
  3713.                         newItem.creators.push(Zotero.Utilities.cleanAuthor(byline[j], "author"));
  3714.                     }
  3715.                 } else {
  3716.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(byline, "author"));
  3717.                 }
  3718.             } else if (metaNames[i] == "keywords") {
  3719.                 var keywords = metaInfo[metaNames[i]].split(",");
  3720.                 for (var k = 0 ; k < keywords.length ; k++) {
  3721.                     if (keywords[k].length > 1) {
  3722.                         newItem.tags.push(Zotero.Utilities.unescapeHTML(keywords[k][0].toUpperCase() + keywords[k].substr(1).toLowerCase()));
  3723.                     }
  3724.                 }
  3725.             }
  3726.         }
  3727.         
  3728.         //abstract
  3729.         var a = /\"Description\"\s+content=\"([^\"]*)\"/;
  3730.         newItem.abstractNote = Zotero.Utilities.unescapeHTML(text.match(a)[1].substring(0, text.match(a)[1].length - 3));
  3731.         
  3732.         newItem.complete();
  3733.         Zotero.done();
  3734.     }, function() {});
  3735. }
  3736.  
  3737. function doWeb(doc, url) {
  3738.     var URLS = new Array();
  3739.     if (url.indexOf("siteSearch.ac") != -1) {
  3740.         var xpath = ''//div[@class="searchresults"]/dl/dt/a'';
  3741.         var titles = new Object();
  3742.         var stuff = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  3743.         var newest = stuff.iterateNext();
  3744.         while (newest) {
  3745.             titles[newest.href] = newest.textContent;
  3746.             newest = stuff.iterateNext();
  3747.         }
  3748.         
  3749.         var items = Zotero.selectItems(titles);
  3750.         
  3751.         for (var i in items) {
  3752.             URLS.push(i.split("u=")[1].replace(/%3A/g,":").replace(/%2F/g,"/").split("&")[0]);
  3753.         }
  3754.     } else {
  3755.         URLS.push(url);
  3756.     }
  3757.     
  3758.     Zotero.debug(URLS);
  3759.     
  3760.     Zotero.Utilities.HTTP.doPost(URLS, "", function(text) {
  3761.         for (var i = 0 ; i < URLS.length ; i++) {
  3762.             scrape(URLS[i]);
  3763.         }
  3764.     });
  3765.     Zotero.wait();
  3766. }');
  3767.  
  3768. REPLACE INTO translators VALUES ('c7830593-807e-48cb-99f2-c3bed2b148c2', '1.0.0b4.r5', '', '2007-08-14 22:15:00', '1', '100', '4', 'New Zealand Herald', 'Michael Berkowitz', '^http://(www|search).nzherald.co.nz/', 
  3769. 'function detectWeb(doc, url) {
  3770.     if (doc.title.indexOf("Search Results") != -1) {
  3771.         return "multiple";
  3772.     } else if (doc.location.href.indexOf("story.cfm") != -1) {
  3773.         return "newspaperArticle";
  3774.     }
  3775. }', 
  3776. 'function scrape(url) {
  3777.     Zotero.Utilities.HTTP.doGet(url, function(text) {
  3778.         var newItem = new Zotero.Item("newspaperArticle");
  3779.         newItem.url = url;
  3780.         newItem.publicationTitle = "New Zealand Herald";
  3781.         
  3782.         //author?
  3783.         var aut = /<a href=\"\/author\/[^>]*>(.*)<\/a>/;
  3784.         if (text.match(aut)) {
  3785.             var author = text.match(aut)[1];
  3786.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  3787.         }
  3788.         
  3789.         //abstract
  3790.         var a = /meta name=\"description\" content=\"([^&]*)/;
  3791.         newItem.abstractNote = text.match(a)[1];
  3792.         
  3793.         //title and date
  3794.         var t = /<title>(.*)<\/title>/;
  3795.         var result = text.match(t)[1].split(" - ");
  3796.         newItem.title = result[0];
  3797.         newItem.date = result[1];
  3798.         
  3799.         //keywords
  3800.         var k = /<meta name=\"keywords\" content=\"(.*)\"/;
  3801.         var kwords = Zotero.Utilities.cleanString(text.match(k)[1]).split(", ");
  3802.         for (var i = 0 ; i < kwords.length ; i++) {
  3803.             newItem.tags.push(kwords[i]);
  3804.         }
  3805.         
  3806.         //section
  3807.         var s = /class=\"current\"><.*><span>(.*)<\/span>/;
  3808.         newItem.section = text.match(s)[1];
  3809.         
  3810.         newItem.complete();
  3811.         Zotero.debug(newItem);
  3812.         
  3813.         Zotero.done();
  3814.     }, function() {});
  3815. }
  3816.  
  3817. function doWeb(doc, url) {
  3818.     var articles = new Array();
  3819.     var names = new Array();
  3820.     if (doc.title.indexOf("Search Results:") != -1) {
  3821.         var URLS = new Array();
  3822.         var titles = new Array();
  3823.         var xpath = ''//p[@class="g"]/a'';
  3824.         var links = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  3825.         var link = links.iterateNext();
  3826.     
  3827.         while (link) {
  3828.             URLS.push(link.href);
  3829.             titles.push(link.textContent);
  3830.             link = links.iterateNext();
  3831.         }
  3832.         
  3833.         Zotero.debug(titles);
  3834.         Zotero.debug(URLS);
  3835.         
  3836.         var newItems = new Object();
  3837.         
  3838.         for (var i = 0 ; i < titles.length ; i++) {
  3839.             newItems[URLS[i]] = titles[i];
  3840.         }
  3841.     
  3842.         newItems = Zotero.selectItems(newItems);
  3843.     
  3844.         Zotero.debug(newItems);
  3845.         
  3846.         for (var i in newItems) {
  3847.             articles.push(i);
  3848.             names.push(newItems[i]);
  3849.         }
  3850.     } else {
  3851.         articles.push(doc.location.href);
  3852.         names.push(Zotero.Utilities.cleanString(doc.title.split("-")[0]));
  3853.     }
  3854.     
  3855.     Zotero.debug(articles);
  3856.     
  3857.     Zotero.Utilities.HTTP.doPost(articles, "", function(text) {
  3858.         for (var i = 0 ; i < articles.length ; i++) {
  3859.             scrape(articles[i]);
  3860.         }
  3861.     });
  3862.     
  3863.     Zotero.wait();
  3864. }');
  3865.  
  3866. REPLACE INTO translators VALUES ('19120a71-17a8-4629-936a-ccdf899b9861', '1.0.0b4.r5', '', '2007-08-14 22:15:00', '1', '99', '4', 'Sydney Morning Herald', 'Michael Berkowitz', '^http://(www|search).smh.com.au/(news|siteSearch|articles)', 
  3867. 'function detectWeb(doc, url) {
  3868.     if (doc.location.href.indexOf("news") != -1 || doc.location.href.indexOf("articles") != -1) {
  3869.         return "newspaperArticle";
  3870.     } else if (doc.location.href.indexOf("siteSearch") != -1) {
  3871.         return "multiple";
  3872.     }
  3873. }', 
  3874. 'function regexMeta(str, item) {
  3875.     var re = /name=\"(.*)\"\s+content=\"(.*)\"\s+\/>/;
  3876.     var stuff = str.match(re);
  3877.     if (stuff[1] == "byline") {
  3878.         authors = stuff[2].split(" and ");
  3879.         for (var i = 0 ; i < authors.length ; i++) {
  3880.             item.creators.push(Zotero.Utilities.cleanAuthor(authors[i].split(" in ")[0], "author"));
  3881.         }
  3882.     } else if (stuff[1] == "sitecategories") {
  3883.         item.section = stuff[2];
  3884.     } else if (stuff[1] == "publishdate") {
  3885.         item.date = stuff[2].split(/\s+/)[0];
  3886.     }
  3887. }
  3888.  
  3889. function doWeb(doc, url) {
  3890.     var articles = new Array();
  3891.     if (doc.location.href.indexOf("siteSearch") != -1) {
  3892.         var items = new Array();
  3893.         var xpath = ''//div[@class="searchresults"]/dl/dt/a'';
  3894.         var stuff = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  3895.         var thing = stuff.iterateNext();
  3896.         while (thing) {
  3897.             items[thing.href] = thing.textContent;
  3898.             thing = stuff.iterateNext();
  3899.         }
  3900.         
  3901.         items = Zotero.selectItems(items);
  3902.         
  3903.         for (var i in items) {
  3904.             articles.push(i);
  3905.         }
  3906.     } else {
  3907.         articles.push(url);
  3908.     }
  3909.     for (var i = 0 ; i < articles.length ; i++) {
  3910.         var url = articles[i]
  3911.         Zotero.Utilities.HTTP.doGet(url, function(text) {
  3912.             var newItem = new Zotero.Item("newspaperArticle");
  3913.             newItem.publicationTitle = "Sydney Morning Herald";
  3914.             newItem.url = url;
  3915.             newItem.ISSN = "0312-6315";
  3916.             //title
  3917.             var t = /<HEADLINE>(.*)<\/HEADLINE>/;
  3918.             newItem.title = Zotero.Utilities.unescapeHTML(Zotero.Utilities.capitalizeTitle(text.match(t)[1]));
  3919.             //hooray for real meta tags!
  3920.             var meta = /<meta\s+name=(.*)\/>/g;
  3921.             var metaTags = text.match(meta);
  3922.             for (var i = 0 ; i <metaTags.length ; i++) {
  3923.                 regexMeta(metaTags[i], newItem);
  3924.             }
  3925.             //abstract
  3926.             var abs = /meta name=\"Description\" content=\"([^\"]*)\"/;
  3927.             var abstract = text.match(abs)[1].split(/\s+/);
  3928.             abstract[0] = abstract[0][0] + abstract[0].substr(1).toLowerCase();
  3929.             abstract = abstract.join(" ");
  3930.             newItem.abstractNote = Zotero.Utilities.unescapeHTML(abstract.substr(0, abstract.length - 3));
  3931.             newItem.complete();
  3932.             Zotero.done();
  3933.         }, function() {});
  3934.     }
  3935.     Zotero.wait();
  3936. }');
  3937.  
  3938. REPLACE INTO translators VALUES ('393afc28-212d-47dd-be87-ec51bc7a58a4', '1.0.0b3.r1', '', '2007-08-14 22:20:00', '1', '100', '4', 'The Australian', 'Michael Berkowitz', '^http://(searchresults|www.theaustralian).news.com.au/', 
  3939. 'function detectWeb(doc, url) {
  3940.     if (url == "http://searchresults.news.com.au/servlet/Search" || url.indexOf("siteSearch") != -1) {
  3941.         return "multiple";
  3942.     } else if (url.indexOf("story") != -1) {
  3943.         return "newspaperArticle";
  3944.     }
  3945. }', 
  3946. 'function scrape(url) {
  3947.     Zotero.Utilities.HTTP.doGet(url, function(text) {
  3948.         var newItem = new Zotero.Item("newspaperArticle");
  3949.         newItem.url = url;
  3950.         newItem.publicationTitle = "The Australian";
  3951.         
  3952.         //title
  3953.         var t = /<title>(.*)<\/title>/;
  3954.         newItem.title = Zotero.Utilities.capitalizeTitle(text.match(t)[1].split(" | ")[0]);
  3955.         
  3956.         //abstract
  3957.         var abs = /meta name=\"description\"\s+content=\"(.*)\"/;
  3958.         var abstract = Zotero.Utilities.unescapeHTML(text.match(abs)[1]).split(" ");
  3959.         abstract[0] = abstract[0][0] + abstract[0].substr(1).toLowerCase();
  3960.         newItem.abstractNote = abstract.join(" ");
  3961.         
  3962.         //tags
  3963.         var t = /meta name=\"keywords\"\s+content=\"(.*)\"/;
  3964.         var tags = text.match(t)[1].split(/,\s+/);
  3965.         for (var i = 0 ; i < tags.length ; i++) {
  3966.             newItem.tags.push(Zotero.Utilities.unescapeHTML(tags[i]));
  3967.         }
  3968.  
  3969.         //section
  3970.         var sec = /active\"><a[^>]*>(.*)<\/a>/;
  3971.         if (text.match(sec)) {
  3972.             newItem.section = text.match(sec)[1];
  3973.         }
  3974.         
  3975.         //timestamp
  3976.         var t = /<em class=\"timestamp\">(.*)<\/em>/;
  3977.         newItem.date = text.match(t)[1];
  3978.         
  3979.         //byline
  3980.         var by = /<div\s+class=\"module-subheader\"><p>(.*)/;
  3981.         if (text.match(by)[1]) {
  3982.             var byline = text.match(by)[1];
  3983.             var authors = new Array();
  3984.             if (byline.indexOf(",") != -1) {
  3985.                 byline = byline.split(",")[0];
  3986.             }
  3987.             if (byline.indexOf(" and ") != -1) {
  3988.                 var authors = byline.split(" and ");
  3989.             } else {
  3990.                 authors.push(byline);
  3991.             }
  3992.             for (var i = 0 ; i < authors.length ; i++) {
  3993.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[i], "author"));
  3994.             }
  3995.         }
  3996.         
  3997.         newItem.complete();
  3998.         Zotero.debug(newItem);
  3999.         
  4000.         Zotero.done();
  4001.     }, function() {});
  4002. }
  4003.  
  4004. function doWeb(doc, url) {
  4005.     var URLS = new Array();
  4006.     var newItems = new Object();
  4007.     if (url == "http://searchresults.news.com.au/servlet/Search") {
  4008.         var articles = new Array();
  4009.         var xpath = ''//ol/li/h4[@class="heading"]/a'';
  4010.         //var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  4011.         
  4012.         newItems = Zotero.Utilities.getItemArray(doc, doc.getElementsByTagName("h4"), /^http:\/\//);
  4013.         newItems = Zotero.selectItems(newItems);
  4014.     } else {
  4015.         newItems[url] = doc.title.split(" | ")[0]; 
  4016.     }
  4017.  
  4018.     for (var i in newItems) {
  4019.         URLS.push(i);
  4020.     }
  4021.     
  4022.     Zotero.debug(URLS);
  4023.     Zotero.Utilities.HTTP.doPost(URLS, "", function(text) {
  4024.         for (var i = 0 ; i < URLS.length ; i++) {
  4025.             scrape(URLS[i]);
  4026.         }
  4027.     });
  4028. }');
  4029.  
  4030. REPLACE INTO translators VALUES ('303bdfc5-11b8-4107-bca1-63ca97701a0f', '1.0.0b3.r1', '', '2007-09-06 19:30:00', '0', '100', '4', 'ASCE', 'Michael Berkowitz', '^http://ascelibrary.aip.org/.+', 
  4031. 'function detectWeb(doc, url) {
  4032.     if (doc.evaluate(''//div[@id="sr-content-wrap"]//div[@class="sr-right"]/p[@class="sr-art-title"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  4033.         return "multiple";
  4034.     } else {
  4035.         return "journalArticle";
  4036.     }
  4037. }', 
  4038. 'function getRIS(doc, url) {
  4039.     var newx = ''//div[@id="sci-art-options-box"]//input[@name="SelectCheck"]'';
  4040.     var key = doc.evaluate(newx, doc, null, XPathResult.ANY_TYPE, null).iterateNext().value;
  4041.     Zotero.debug(key);
  4042.     var citation = ''http://ascelibrary.aip.org/getabs/servlet/GetCitation?source=scitation&PrefType=ARTICLE&PrefAction=Add+Selected&SelectCheck='' + key + ''&fn=open_refworks&downloadcitation=+Go+'';
  4043.     Zotero.Utilities.HTTP.doGet(citation, function(text) {
  4044.         var translator = Zotero.loadTranslator("import");
  4045.         text = text.replace(/RT/, "TY");
  4046.         text = text.replace(/VO/, "VL");
  4047.         text = text.replace(/LK/, "UR");
  4048.         text = text.replace(/YR/, "PY");
  4049.         Zotero.debug(text);
  4050.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  4051.         translator.setString(text.replace(/([A-Z][A-Z\d]\s)/g, "$1 - "));
  4052.         translator.setHandler("itemDone", function(obj, item) {
  4053.             item.attachments = [
  4054.                 {url:item.url, title:"ASCE Snapshot", mimeType:"text/html"},
  4055.                 {url:"http://ascelibrary.aip.org/getpdf/servlet/GetPDFServlet?filetype=pdf&id=" + key + "&idtype=cvips&prog=search", title:"EAS Full Text PDF", mimeType:"application/pdf"}
  4056.             ];
  4057.             //item.itemType = "journalArticle";
  4058.             item.complete();
  4059.         });
  4060.         translator.translate();
  4061.         Zotero.wait();
  4062.         Zotero.done();
  4063.     });
  4064. }
  4065.  
  4066. function doWeb(doc, url) {
  4067.     var articles = new Array();
  4068.     var items = new Object();
  4069.     var xpath = ''//div[@class="sr-right"]/p[@class="sr-art-title"]/a'';
  4070.     if (doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  4071.         var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  4072.         while (new_title = titles.iterateNext()) {
  4073.             items[new_title.href] = new_title.textContent;
  4074.         }
  4075.         
  4076.         items = Zotero.selectItems(items);
  4077.         
  4078.         for (var i in items) {
  4079.             articles.push(i)
  4080.         }
  4081.     } else {
  4082.         var newx = ''//div[@id="sci-art-options-box"]//input[@name="SelectCheck"]'';
  4083.         var stuff = doc.evaluate(newx, doc, null, XPathResult.ANY_TYPE, null).iterateNext().value;
  4084.         Zotero.debug(stuff);
  4085.         articles.push(url);
  4086.     }
  4087.  
  4088.     Zotero.debug(articles);
  4089.     Zotero.Utilities.processDocuments(articles, getRIS, function() {Zotero.done});
  4090.     Zotero.wait();
  4091.  
  4092. }
  4093. ');
  4094.  
  4095. REPLACE INTO translators VALUES ('5af42734-7cd5-4c69-97fc-bc406999bdba', '1.0.0b4.r5', '', '2008-01-06 23:55:00', '0', '100', '4', 'ESA Journals', 'Michael Berkowitz', '^http://www.esajournals.org/*', 
  4096. 'function detectWeb(doc, url) {
  4097.     if (url.indexOf("get-toc") != -1 || url.indexOf("searchtype") != -1) {
  4098.         return "multiple";
  4099.     } else if (url.indexOf("get-document") != -1 || url.indexOf("get-abstract") != -1) {
  4100.         return "journalArticle";
  4101.     }
  4102. }', 
  4103. 'function senCase(string) {
  4104.     var smallwords = Array("AND", "A", "IN", "THE", "BY", "OF");
  4105.     var sen = string.split(/\b/);
  4106.     for (var i = 0 ; i < sen.length; i++) {
  4107.         if (sen[i].match(/\w+/)) {
  4108.             if (smallwords.indexOf(sen[i]) != -1 && i != 0) {
  4109.                 sen[i] = sen[i].toLowerCase();
  4110.             } else {
  4111.                 sen[i] = sen[i][0] + sen[i].substring(1).toLowerCase();
  4112.             }
  4113.         }
  4114.     }
  4115.     return sen.join("");
  4116. }
  4117.  
  4118. function doWeb(doc, url) {
  4119.     var namespace = doc.documentElement.namespaceURI;
  4120.     var nsResolver = namespace ? function(prefix) {
  4121.     if (prefix == ''x'') return namespace; else return null;
  4122.            } : null;
  4123.     
  4124.     var items = new Array();
  4125.     if (url.indexOf("get-toc") != -1) {
  4126.         var titlesAr = new Array();
  4127.         var linksAr = new Array();
  4128.         
  4129.         var group_xpath = ''//div[@class="group"]'';
  4130.         var articles = doc.evaluate(group_xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  4131.         while (group = articles.iterateNext()) {
  4132.             //gets article titles
  4133.             titlesAr.push(doc.evaluate(''.//p[@class="title"]'', group, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  4134.             
  4135.             //gets full text links, or abstracts if that''s all that''s available
  4136.             var link_xpath = ''.//p[@class="link"]'';
  4137.             if (group.textContent.indexOf("Full Text") != -1) {
  4138.             link_xpath += ''/a[substring(text(), 1, 4) = "Full"]'';
  4139.             } else if (group.textContent.indexOf("Abstract") != -1) {
  4140.                 link_xpath += ''/a[substring(text(), 1, 8) = "Abstract"]'';
  4141.             }
  4142.             linksAr.push(doc.evaluate(link_xpath, group, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href);
  4143.         }
  4144.         
  4145.         var articles = new Object();
  4146.         for (var i = 0 ; i < linksAr.length ; i++) {
  4147.             articles[linksAr[i]] = senCase(titlesAr[i]);
  4148.         }
  4149.         
  4150.         articles = Zotero.selectItems(articles);
  4151.         
  4152.         
  4153.         
  4154.         for (var i in articles) {
  4155.             items.push(i);
  4156.         }
  4157.     } else {
  4158.         items.push(url);
  4159.     }
  4160.     
  4161.     for (var i = 0 ; i < items.length ; i++) {
  4162.         var re= /<a href=\"([^"]*)\"?>RefWorks Format/;
  4163.         var doi = items[i].split("doi=")[1];
  4164.         var URI = "http://www.esajournals.org/perlserv/?request=cite-builder&doi=" + doi;
  4165.         Zotero.Utilities.HTTP.doGet(URI, function(text) {
  4166.             var newURI = Zotero.Utilities.unescapeHTML(text.match(re)[1]);
  4167.             Zotero.Utilities.HTTP.doGet("http://" + doc.location.host + "/perlserv/" + newURI, function(text) {
  4168.                 var translator = Zotero.loadTranslator("import");
  4169.                 text = text.replace(/RT/, "TY");
  4170.                 text = text.replace(/VO/, "VL");
  4171.                 text = text.replace(/LK/, "UR");
  4172.                 text = text.replace(/YR/, "PY");
  4173.                 translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  4174.                 translator.setString(text.replace(/([A-Z][A-Z\d]\s)/g, "$1 - "));
  4175.                 translator.setHandler("itemDone", function(obj, item) {
  4176.                     item.attachments = [
  4177.                         {url:item.url, title:"EAS Snapshot", mimeType:"text/html"},
  4178.                         {url:"http://www.esajournals.org/perlserv/?request=res-loc&uri=urn%3Aap%3Apdf%3Adoi%3A" + doi, title:"EAS Full Text PDF", mimeType:"application/pdf"}
  4179.                     ];
  4180.                     item.itemType = "journalArticle";
  4181.                     item.title = item.title.replace(/\s+\-\s+/g, " ");
  4182.                     if (item.title.indexOf("JF") != -1) {
  4183.                         item.title = item.title.substring(0, item.title.indexOf("JF") - 1);
  4184.                     }
  4185.                     item.title = senCase(item.title);
  4186.                     item.abstractNote = item.notes[0][''note''];
  4187.                     item.complete();
  4188.                 });
  4189.                 translator.translate();
  4190.                 Zotero.wait();
  4191.                 Zotero.done();
  4192.             });
  4193.         });
  4194.     }
  4195.     Zotero.wait();
  4196. }');
  4197.  
  4198. REPLACE INTO translators VALUES ('1f40baef-eece-43e4-a1cc-27d20c0ce086', '1.0.0b4.r1', '', '2007-07-31 19:40:00', '1', '100', '4', 'Engineering Village', 'Ben Parr', '^https?://(?:www\.)?engineeringvillage(2)?\.(?:com|org)', 
  4199. 'function detectWeb(doc, url)
  4200. {
  4201.     var namespace = doc.documentElement.namespaceURI;
  4202.     var nsResolver = namespace ? function(prefix) {
  4203.             if (prefix == ''x'') return namespace; else return null;
  4204.         } : null;
  4205.         
  4206.     var xpath=''//a[img/@style="vertical-align: middle;"][@href]'';
  4207.     if(doc.evaluate(xpath, doc,
  4208.         nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  4209.         {  return "journalArticle";}
  4210.         
  4211.     xpath=''//input[@name="cbresult"]/@onclick'';
  4212.     if(doc.evaluate(xpath, doc,
  4213.         nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  4214.         {  return "multiple";}
  4215.         
  4216.     return null;
  4217. }', 
  4218. 'function parseRIS(uris)
  4219. {    
  4220.      Zotero.Utilities.HTTP.doGet(uris, function(text){
  4221.              // load translator for RIS
  4222.              var translator = Zotero.loadTranslator("import");
  4223.              translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  4224.              translator.setString(text);
  4225.              translator.translate();
  4226.              Zotero.done();
  4227.      }, function() {});
  4228.      Zotero.wait();
  4229. }
  4230.  
  4231. //creates the link to the RIS file
  4232. function createURL(EISESSION,docidlist,curURL)
  4233. {
  4234.     var milli = (new Date()).getTime();
  4235.     var temp = curURL.split(''/'');        
  4236.     var url = temp.slice(0,temp.length-1).join(''/'') + "/Controller?EISESSION="+EISESSION;
  4237.     url+="&CID=downloadSelectedRecordsris&format=ris&displayformat=fullDoc×tamp="
  4238.     url+=milli;
  4239.     url+="&docidlist=";
  4240.     url+=docidlist;
  4241.     url+="&handlelist=1";
  4242.     return url;
  4243. }
  4244.  
  4245. function doWeb(doc, url) {
  4246.     var namespace = doc.documentElement.namespaceURI;
  4247.     var nsResolver = namespace ? function(prefix) {
  4248.             if (prefix == ''x'') return namespace; else return null;
  4249.         } : null;
  4250.         var url;
  4251.         var xpath=''//a[img/@style="vertical-align: middle;"][@href]'';
  4252.     if(doc.evaluate(xpath, doc,
  4253.         nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  4254.     {
  4255.         xpath=''//a[@class="MedBlueLink"][img]/@onclick'';
  4256.         var temp=doc.evaluate(xpath, doc,
  4257.             nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  4258.         var docidlist=temp.value;
  4259.     
  4260.         docidlist=docidlist.split("MID=")[1];
  4261.         docidlist=docidlist.split("&")[0];
  4262.     
  4263.         xpath=''//a[img/@style="vertical-align: middle;"][@href]'';
  4264.         temp=doc.evaluate(xpath, doc,
  4265.             nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  4266.  
  4267.         var EISESSION =temp.href;
  4268.         EISESSION=EISESSION.split("(''")[1];
  4269.         EISESSION=EISESSION.split("''")[0];
  4270.         url=createURL(EISESSION,docidlist,doc.location.href);
  4271.         parseRIS(url);
  4272.     }
  4273.     else
  4274.     {
  4275.         xpath=''//input[@NAME="sessionid"]'';
  4276.         var EISESSION=doc.evaluate(xpath, doc,
  4277.             nsResolver,XPathResult.ANY_TYPE,null).iterateNext().value;
  4278.         
  4279.         xpath=''//input[@name="cbresult"]/@onclick'';
  4280.         
  4281.         var items=new Array();
  4282.         var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null);
  4283.         var xpath2=''//a[@class="MedBlackText"]/b'';
  4284.         xpath2=doc.evaluate(xpath2, doc, nsResolver,XPathResult.ANY_TYPE,null);
  4285.         var title;
  4286.         var docidlist;
  4287.         while(row=rows.iterateNext())
  4288.         {
  4289.             docidlist=row.value;
  4290.             docidlist=docidlist.split("''")[1];
  4291.             
  4292.             url=createURL(EISESSION,docidlist,doc.location.href);
  4293.             
  4294.             title=xpath2.iterateNext();
  4295.             title=title.textContent;
  4296.             
  4297.             items[url]=title;            
  4298.         }
  4299.         items = Zotero.selectItems(items);
  4300.              if(!items) return true;
  4301.              var dois="";
  4302.              var theurls= new Array();
  4303.              for(var thelink in items)
  4304.              {
  4305.                     theurls.push(thelink);
  4306.              }
  4307.     parseRIS(theurls);
  4308.     }
  4309. }');
  4310.  
  4311.  
  4312. REPLACE INTO translators VALUES ('13b9f6fe-ded7-4f91-8c55-5d6ce64fb43e', '1.0.0b4.r1', '', '2007-06-27 02:00:00', '0', '100', '4', 'SPIE Digital Library', 'Asa Kusuma', '^https?://spiedigitallibrary\.aip\.org/', 
  4313. 'function detectWeb(doc, url) {
  4314.     var namespace = doc.documentElement.namespaceURI;
  4315.     var nsResolver = namespace ? function(prefix) {
  4316.         if (prefix == ''x'') return namespace; else return null;
  4317.     } : null;
  4318.     
  4319.     var singXpath = ''//input[@name="SelectCheck"][@type="hidden"]'';
  4320.     var multXpath = ''//input[@name="SelectCheck"][@type="checkbox"]'';
  4321.     
  4322.     
  4323.     //var str=doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  4324.     //Zotero.debug("StRRRr: "+str);
  4325.     if (doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4326.         return "multiple";
  4327.     } if (doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4328.         
  4329.         return "journalArticle";
  4330.         
  4331.     }
  4332. }
  4333. ', 
  4334. 'function parseRIS(uris) {
  4335.     
  4336.     Zotero.debug("Begin parsing RIS");
  4337.     Zotero.Utilities.HTTP.doGet(uris, function(text){    
  4338.         // load translator for RIS
  4339.         var translator = Zotero.loadTranslator("import");
  4340.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  4341.         translator.setString(text);
  4342.         translator.translate();
  4343.         Zotero.done();
  4344.     }, function() {});
  4345.     Zotero.wait();
  4346. }
  4347.  
  4348. function doWeb(doc, url) {
  4349.     
  4350.     var namespace = doc.documentElement.namespaceURI;
  4351.     var nsResolver = namespace ? function(prefix) {
  4352.         if (prefix == ''x'') return namespace; else return null;
  4353.     } : null;
  4354.     
  4355.     var singXpath = ''//input[@name="SelectCheck"][@type="hidden"]'';
  4356.     var multXpath = ''//input[@name="SelectCheck"][@type="checkbox"]'';
  4357.     
  4358.  
  4359.     if (doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4360.         //multiple
  4361.         
  4362.         
  4363.         Zotero.debug("Multiple Step 1");
  4364.         var searchtitle = ''//tbody/tr/td/table/tbody/tr[2]/td/font/b'';
  4365.         var bibXpath = ''//input[@name="SelectCheck"][@type="checkbox"]'';
  4366.         var pagetype="";
  4367.         
  4368.         //Checks what type of multiple page it is, search or browse.
  4369.         if(doc.evaluate(searchtitle, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4370.             var titleXpath=''//a/b'';
  4371.             pagetype="search";
  4372.             Zotero.debug("Found a search page");
  4373.         } else {
  4374.             var titleXpath=''//ul/strong'';
  4375.             Zotero.debug("Found a browse page");
  4376.             pagetype="browse";
  4377.         }
  4378.         var bibElmts = doc.evaluate(bibXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  4379.         var titleElmts = doc.evaluate(titleXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  4380.         var titleElmt;
  4381.         var bibElmt;
  4382.         bibElmt = bibElmts.iterateNext();
  4383.         titleElmt = titleElmts.iterateNext();
  4384.         
  4385.         var items = new Array();
  4386.         Zotero.debug("Multiple Step 2");
  4387.         do {
  4388.             
  4389.             Zotero.debug("SelectCheck: "+bibElmt.value);
  4390.             items[bibElmt.value] = Zotero.Utilities.cleanString(titleElmt.textContent);
  4391.             if(pagetype=="search") {
  4392.                 titleElmt = titleElmts.iterateNext();
  4393.             }
  4394.         } while((bibElmt = bibElmts.iterateNext()) && (titleElmt = titleElmts.iterateNext()));
  4395.  
  4396.         items = Zotero.selectItems(items);
  4397.         if(!items) return true;
  4398.     
  4399.         var bibcodes="";
  4400.         var uris = new Array();
  4401.         for(var bibcode in items) {
  4402.             Zotero.debug("Export SelectCheck: "+bibcode);
  4403.         
  4404.             var getURL = "http://spiedigitallibrary.aip.org/getabs/servlet/GetCitation?fn=view_isi&source=scitation&PrefType=ARTICLE&PrefAction=Add+Selected&SelectCheck=";
  4405.                 getURL=getURL + bibcode +  "&downloadcitation=+Go+";
  4406.                 Zotero.debug(getURL);
  4407.             uris.push(getURL);
  4408.         }
  4409.         
  4410.         parseRIS(uris);
  4411.         
  4412.         
  4413.     } if (doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  4414.         singXpath = ''//input[@name="SelectCheck"][@type="hidden"]'';
  4415.     
  4416.         var selectid=doc.evaluate(singXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  4417.         Zotero.debug("Node Value: "+selectid);
  4418.         //single
  4419.         var url="http://spiedigitallibrary.aip.org/getabs/servlet/GetCitation?fn=view_isi&source=scitation&PrefType=ARTICLE&PrefAction=Add+Selected&SelectCheck=";
  4420.         //PSISDG001207000001000088000001
  4421.         url = url+selectid;
  4422.         url = url + "&downloadcitation=+Go+";
  4423.         var idarray = new Array();
  4424.         idarray.push(url);
  4425.         parseRIS(idarray);
  4426.     }
  4427.     
  4428.     
  4429.     
  4430. }');
  4431.  
  4432. REPLACE INTO translators VALUES ('ab961e61-2a8a-4be1-b8a3-044f20d52d78', '1.0.0b4.r1', '', '2007-07-31 16:45:00', '0', '100', '4', 'BIBSYS', 'Ramesh Srigiriraju', '^http://ask\.bibsys\.no/ask/action', 
  4433. 'function detectWeb(doc, url)    {
  4434.     var multireg=new RegExp("^http://ask\.bibsys\.no/ask/action/result");
  4435.     if(multireg.test(url))
  4436.         return "multiple";
  4437.     var singlereg=new RegExp("^http://ask\.bibsys\.no/ask/action/show");
  4438.     if(singlereg.test(url))
  4439.         return "book";
  4440. }', 
  4441. 'function doWeb(doc, url)    {
  4442.     var namespace=doc.documentElement.namespaceURI;
  4443.     var nsResolver=namespace?function(prefix)    {
  4444.         return (prefix=="x")?namespace:null;
  4445.     }:null;
  4446.     var multireg=new RegExp("http://ask\.bibsys\.no/ask/action/result");
  4447.     if(multireg.test(url))    {
  4448.         var titlpath=''//tr/td[@width="49%"][@align="left"][@valign="top"]/a/text()'';
  4449.         var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  4450.         var codepath=''//tr/td/input[@type="checkbox"][@name="valg"]/@value'';
  4451.         var codes=doc.evaluate(codepath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  4452.         var items=new Array();
  4453.         var title;
  4454.         titles.iterateNext();
  4455.         while(title=titles.iterateNext())
  4456.             items[codes.iterateNext().nodeValue]=title.nodeValue;
  4457.         items=Zotero.selectItems(items);
  4458.         var string="http://ask.bibsys.no/ask/action/result?control=ctr_top";
  4459.         for(var codes in items)
  4460.             string+="&valg="+codes;
  4461.         string+="&control=ctr_bottom&eksportFormat=refmanager&eksportEpostAdresse=&eksportEpostFormat=fortekst&cmd=sendtil";
  4462.         Zotero.Utilities.HTTP.doGet(string, function(text)    {
  4463.             var trans=Zotero.loadTranslator("import");
  4464.             trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  4465.             trans.setString(text);
  4466.             trans.translate();
  4467.             Zotero.done();
  4468.         });
  4469.         Zotero.wait();
  4470.     }
  4471.     var singlereg=new RegExp("http://ask\.bibsys\.no/ask/action/show");
  4472.     if(singlereg.test(url))    {
  4473.         var urlstring="http://ask.bibsys.no/ask/action/show";
  4474.         var data="visningsformat=fortekst_m_eksemplarer&eksportFormat=refmanager&eksportEpostAdresse=&eksportEpostFormat=fortekst&cmd=sendtil";
  4475.         Zotero.Utilities.HTTP.doPost(urlstring, data, function(text)    {
  4476.             var trans=Zotero.loadTranslator("import");
  4477.             trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  4478.             trans.setString(text);
  4479.             trans.translate();
  4480.             Zotero.done();
  4481.         });
  4482.         Zotero.wait();
  4483.     }
  4484. }');
  4485.  
  4486. REPLACE INTO translators VALUES ('f4130157-93f7-4493-8f24-a7c85549013d', '1.0.0b4.r1', '', '2007-08-27 05:00:00', '0', '100', '4', 'BBC', 'Ben Parr', '^https?://(?:www|news?)\.bbc\.co.uk', 
  4487. 'function detectWeb(doc, url)
  4488. {
  4489.  
  4490.        var namespace = doc.documentElement.namespaceURI;
  4491.       var nsResolver = namespace ? function(prefix) {
  4492.       if (prefix == ''x'') return namespace; else return null;
  4493.       } : null;
  4494.  
  4495.     var xpath;
  4496.       
  4497.      xpath=''//meta[@name="Headline"]'';
  4498.      if(content=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  4499.      { return "newspaperArticle";  }
  4500.      
  4501.      xpath=''//font[@class="poshead"]/b'';
  4502.      if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  4503.     { return "newspaperArticle";  }
  4504.     
  4505.       return null;
  4506. }', 
  4507. 'function scrape(doc,url,title)
  4508. {
  4509.           var namespace = doc.documentElement.namespaceURI;
  4510.                var nsResolver = namespace ? function(prefix) {
  4511.                 if (prefix == ''x'') return namespace; else return null;
  4512.                 } : null;
  4513.          
  4514.          var newItem = new Zotero.Item("newspaperArticle");
  4515.     
  4516.           newItem.url=url;
  4517.          newItem.repository="bbc.co.uk";
  4518.          newItem.publicationTitle="BBC";
  4519.          newItem.title=title;
  4520.          
  4521.          xpath=''//meta[@name="OriginalPublicationDate"]/@content'';
  4522.          var temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext();
  4523.          if(temp)
  4524.          {
  4525.         temp=temp.value;
  4526.              temp=temp.split(" ")[0];
  4527.              newItem.date=temp;
  4528.          }
  4529.          else
  4530.          {
  4531.              xpath=''//font[@class="postxt"][@size="1"]'';
  4532.              var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  4533.              var row;
  4534.              while(row=rows.iterateNext())
  4535.              {
  4536.                  temp=row.textContent;
  4537.                  if(temp.substr(0,9)=="Created: ")
  4538.                  {
  4539.                      newItem.date=temp.substr(9);
  4540.                      break;
  4541.                  }
  4542.              }
  4543.          }
  4544.          
  4545.          xpath=''//meta[@name="Section"]/@content'';
  4546.         temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext();
  4547.          if(temp)
  4548.          {     newItem.section=temp.value;     }
  4549.          
  4550.          xpath=''//meta[@name="Description"]/@content'';
  4551.          temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext();
  4552.          if(temp)
  4553.          {     newItem.abstractNote=temp.value;     }
  4554.          else
  4555.          {
  4556.              xpath=''//meta[@name="description"]/@content'';
  4557.                   temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext();
  4558.                  if(temp)
  4559.                  {     newItem.abstractNote=temp.value;     }
  4560.          }
  4561.          
  4562.          newItem.attachments.push({url:url, title:"BBC News Snapshot",mimeType:"text/html"});
  4563.          
  4564.          newItem.complete();
  4565. }
  4566.  
  4567.  
  4568.  
  4569. function doWeb(doc,url)
  4570. {
  4571.        var namespace = doc.documentElement.namespaceURI;
  4572.       var nsResolver = namespace ? function(prefix) {
  4573.       if (prefix == ''x'') return namespace; else return null;
  4574.       } : null;
  4575.       
  4576.       var xpath=''//meta[@name="Headline"]/@content'';
  4577.       var title;
  4578.      if(title=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  4579.          {  scrape(doc,url,title.value) }
  4580.      else
  4581.      {
  4582.          xpath=''//font[@class="poshead"]/b'';
  4583.          if(title=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  4584.                  {   scrape(doc,url,title.textContent)  }
  4585.      }
  4586.  
  4587.      
  4588. }');
  4589.  
  4590. REPLACE INTO translators VALUES ('dbb5d4bc-3b21-47a2-9751-5dcbb65b902a', '1.0.0b4.r1', '', '2007-07-31 16:45:00', '0', '100', '4', 'AMS Online Journals - Allenpress', 'Ben Parr', '^http://ams.allenpress.com/', 
  4591. 'function detectWeb(doc,url)
  4592. {
  4593.       var namespace = doc.documentElement.namespaceURI;
  4594.       var nsResolver = namespace ? function(prefix) {
  4595.       if (prefix == ''x'') return namespace; else return null;
  4596.       } : null;
  4597.  
  4598.           var xpath;
  4599.           
  4600.     //Homepage=AMS Top 20
  4601.     var temp=url.split("request=")[1];
  4602.     if(temp)
  4603.     {
  4604.         if(temp.substr(0,10)=="index-html")
  4605.         { return "multiple"; }
  4606.     }
  4607.     
  4608.     
  4609.     //browse page
  4610.     xpath=''//div[@class="group"]/p[@class="title"]'';
  4611.     if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  4612.         { return "multiple"; }
  4613.         
  4614.     //second browse page format
  4615.     xpath=''//div[@class="toc include j"]/p/span[@class="title"]'';
  4616.     if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  4617.         { return "multiple"; }
  4618.     
  4619.         
  4620.     //search page 
  4621.     xpath=''//td[@class="search"]/span[@class="title"]'';
  4622.     if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  4623.         { return "multiple"; }
  4624.         
  4625.     //single page
  4626.     xpath=''//ul/li/a'';
  4627.     var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  4628.     var row;
  4629.     
  4630.     while(row=rows.iterateNext())
  4631.     {
  4632.         if(row.textContent=="Create Reference")
  4633.             { return "journalArticle"; }
  4634.     }
  4635.     
  4636. }', 
  4637. 'function parseRIS(temp,PDFs)
  4638. {
  4639.       Zotero.Utilities.HTTP.doGet(temp, function(text){
  4640.  
  4641.               // load translator for RIS
  4642.               var translator = Zotero.loadTranslator("import");
  4643.           
  4644.               translator.setHandler("itemDone", function(obj, newItem) {
  4645.         //get doi of the item we''re currently saving from RIS file
  4646.         var doi=newItem.DOI;
  4647.         if(!doi)
  4648.             {doi=newItem.url.replace(''http://dx.doi.org/'','''');}
  4649.         else
  4650.             {doi=doi.replace("doi%3A","");}
  4651.         
  4652.         var urlstring='''';
  4653.         var volume=newItem.volume;
  4654.         var issue=newItem.issue;
  4655.         var d=newItem.pages.split("-")[0];
  4656.         
  4657.         var pdf = PDFs.shift();
  4658.         if(pdf)
  4659.         {
  4660.             if(pdf=="0")
  4661.             {
  4662.                 var b=doi.split("/");
  4663.                 if(b.length>1)
  4664.                     {b=b[1];}
  4665.                 else
  4666.                     {b=doi.split("%2F")[1];}
  4667.                 b=b.split("(")[0];
  4668.                 b=b.split("%28")[0];
  4669.                 if(!b||b.length!=9)
  4670.                     {b="1520-0477";}
  4671.                 urlstring="http://ams.allenpress.com/archive/"+b+"/"+volume+"/"+issue+"/pdf/i"+b+"-"+volume+"-"+issue+"-"+d+".pdf";
  4672.             }
  4673.             else if(pdf=="1")
  4674.             {
  4675.                 while(volume.length<3)
  4676.                     {volume="0"+volume;}
  4677.                 while(issue.length<2)
  4678.                     {issue="0"+issue;}
  4679.                 while(d.length<4)
  4680.                     {d="0"+d;}
  4681.                 
  4682.                 urlstring="http://docs.lib.noaa.gov/rescue/mwr/"+volume+"/mwr-"+volume+"-"+issue+"-"+d+".pdf";
  4683.             }
  4684.         }
  4685.         newItem.attachments[0]={
  4686.                 title:"AMS Journals Full Text PDF",
  4687.                 url:urlstring, mimeType:"application/pdf"}
  4688.         
  4689.         if(Zotero.Utilities.cleanString(newItem.abstractNote).toLowerCase()=="no abstract available.")
  4690.             {newItem.abstractNote='''';}
  4691.         newItem.complete();
  4692.         });
  4693.         
  4694.               translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  4695.               translator.setString(text);
  4696.               translator.translate();
  4697.  
  4698.               Zotero.done();
  4699.       }, function() {});
  4700.       Zotero.wait();
  4701. }
  4702.  
  4703.  
  4704. function createLink(link)
  4705. {
  4706.     var url="http://ams.allenpress.com/perlserv/?request=download-citation&t=refman&doi=";
  4707.     url+=getdoi(link);
  4708.     url+="&site=amsonline";
  4709.     return url;
  4710. }
  4711.  
  4712. function getdoi(link)
  4713. {
  4714.     doi=link.split("doi%3A")[1];
  4715.     if(!doi)
  4716.     {
  4717.         doi=link.split("doi=")[1];
  4718.         return doi;
  4719.     }
  4720.     return doi;
  4721. }
  4722.  
  4723. function getType(text)
  4724. {
  4725.     if(text.indexOf("(")>-1)
  4726.         {return "0";}
  4727.     else
  4728.         {return "1";}
  4729. }
  4730.  
  4731. function doWeb(doc,url)
  4732. {
  4733.       var namespace = doc.documentElement.namespaceURI;
  4734.       var nsResolver = namespace ? function(prefix) {
  4735.       if (prefix == ''x'') return namespace; else return null;
  4736.       } : null;
  4737.  
  4738.         var doi;
  4739.         var PDFs=new Array();
  4740.     var xpath=''//ul/li/a'';
  4741.     var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  4742.     var row;
  4743.     
  4744.     while(row=rows.iterateNext())
  4745.     {
  4746.         if(row.textContent=="Create Reference")
  4747.         {
  4748.                 //single page
  4749.                 
  4750.                 var thelink=createLink(row.href);
  4751.                 xpath=''//div[@class="mainPadding"]/div/div/div/div/div/p/a'';
  4752.                 rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  4753.                 while(row=rows.iterateNext())
  4754.                 {
  4755.                     if(row.textContent.toLowerCase().indexOf("pdf")>-1)
  4756.                         {PDFs.push(getType(row.textContent));}
  4757.                 }
  4758.                 parseRIS(thelink,PDFs);
  4759.                 
  4760.                 return null;
  4761.         }
  4762.     }
  4763.     
  4764.     var items=new Array();
  4765.     
  4766.     xpath=''//div[@class="group"]/p[@class="title"]'';
  4767.     var xpath1='''';
  4768.     var xpath2='''';
  4769.     
  4770.     if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  4771.     {
  4772.         //browse page
  4773.         
  4774.         xpath1=''//div[@class="group"]/p[@class="title"]'';
  4775.         xpath2=''//p[@class="link"]/a'';
  4776.     }
  4777.     else
  4778.     {
  4779.         xpath=''//td[@class="search"]/span[@class="title"]'';
  4780.         if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  4781.         {
  4782.             //search page
  4783.             
  4784.             xpath1=''//td[@class="search"]/span[@class="title"]'';
  4785.             xpath2=''//tr/td/a'';
  4786.         }
  4787.         else
  4788.         {
  4789.             xpath=''//div[@class="toc include j"]/p/span[@class="title"]'';
  4790.             if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null).iterateNext())
  4791.             {
  4792.                 //second browse format
  4793.                 
  4794.                 xpath1=''//div[@class="toc include j"]/p/span[@class="title"]'';
  4795.                 xpath2=''//div[@class="toc include j"]/p/a'';
  4796.             }
  4797.         }
  4798.     }
  4799.     
  4800.     if(xpath1!='''')
  4801.     {
  4802.         var rows1=doc.evaluate(xpath1, doc, nsResolver,XPathResult.ANY_TYPE, null);
  4803.         var row1;
  4804.         
  4805.         var rows2=doc.evaluate(xpath2, doc, nsResolver,XPathResult.ANY_TYPE, null);
  4806.         var row2=rows2.iterateNext();
  4807.         
  4808.         var rows3=doc.evaluate(xpath2, doc, nsResolver,XPathResult.ANY_TYPE, null);
  4809.         var row3;
  4810.         
  4811.         var tPDFs=new Array();
  4812.         var nextType;
  4813.         
  4814.         var link;
  4815.         var lastdoi;
  4816.         
  4817.         while(row1=rows1.iterateNext())
  4818.         {
  4819.             while(row3=rows3.iterateNext())
  4820.             {
  4821.                 if(row3.textContent.toLowerCase().indexOf("pdf")>-1)
  4822.                     {tPDFs.push(getType(row3.textContent));}
  4823.             }
  4824.             while(getdoi(row2.href)==lastdoi || !getdoi(row2.href))
  4825.                 {row2=rows2.iterateNext()}
  4826.             
  4827.             lastdoi=getdoi(row2.href);
  4828.             link=createLink(row2.href);
  4829.             
  4830.             nextType=tPDFs.shift();
  4831.             if(!nextType)
  4832.                 {nextType="none";}
  4833.             items[nextType+link]=row1.textContent;
  4834.         }
  4835.     }
  4836.     else
  4837.     {
  4838.         var t=url.split("request=")[1];
  4839.         if(t)
  4840.         {
  4841.             if(t.substr(0,10)=="index-html")
  4842.             {
  4843.                 //Homepage=AMS Top 20
  4844.                 
  4845.                 xpath=''//div/p/a[@style="font-size: 85%;"]'';
  4846.                 var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  4847.                 var row;
  4848.     
  4849.                 while(row=rows.iterateNext())
  4850.                     {items["0"+createLink(row.href)]=row.textContent;}
  4851.             }
  4852.     
  4853.         }
  4854.     }
  4855.         
  4856.         items = Zotero.selectItems(items);
  4857.                 
  4858.         if(!items)
  4859.             {return true;}
  4860.         
  4861.         var urls = new Array();
  4862.         for(var i in items)
  4863.         {
  4864.             PDFs.push(i[0]);
  4865.             urls.push(i.substr(1));
  4866.         }
  4867.         
  4868.         parseRIS(urls,PDFs);
  4869. }');
  4870.  
  4871. REPLACE INTO translators VALUES ('7e51d3fb-082e-4063-8601-cda08f6004a3', '1.0.0b4.r1', '', '2007-07-31 16:45:00', '0', '100', '4', 'Education Week', 'Ben Parr', '^https?://(?:www\.|blogs\.|www2\.)?edweek', 
  4872. 'function detectWeb(doc,url)
  4873. {
  4874.        var namespace = doc.documentElement.namespaceURI;
  4875.        var nsResolver = namespace ? function(prefix) {
  4876.        if (prefix == ''x'') return namespace; else return null;
  4877.        } : null;
  4878.        
  4879.        var xpath=''//meta[@name="Story_type"]/@content'';
  4880.        var temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  4881.        if(temp)
  4882.        {
  4883.                if(temp.value=="Blog")
  4884.                        {return "blogPost";}
  4885.                if(temp.value.indexOf("Story")>-1)
  4886.                        {return "magazineArticle";}
  4887.        }
  4888. }', 
  4889. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  4890.       if(metaTags[field]) {
  4891.               newItem[zoteroField] = metaTags[field];
  4892.       }
  4893. }
  4894.  
  4895. function scrape(doc, url) {
  4896.  
  4897.       var newItem = new Zotero.Item("magazineArticle");
  4898.        if(url&&url.indexOf("blogs.edweek.org")>-1)
  4899.                {newItem.itemType="blogPost";}
  4900.  
  4901.       newItem.url = doc.location.href;
  4902.  
  4903.       var metaTags = new Object();
  4904.  
  4905.       var metaTagHTML = doc.getElementsByTagName("meta");
  4906.       var i;
  4907.       for (i = 0 ; i < metaTagHTML.length ; i++) {
  4908.               metaTags[metaTagHTML[i].getAttribute("name")]=Zotero.Utilities.cleanTags(metaTagHTML[i].getAttribute("content"));
  4909.       }
  4910.       associateMeta(newItem, metaTags, "Title", "title");
  4911.       associateMeta(newItem, metaTags, "Cover_date", "date");
  4912.       associateMeta(newItem, metaTags, "Description", "abstractNote");
  4913.       associateMeta(newItem, metaTags, "ArticleID", "accessionNumber");
  4914.       associateMeta(newItem,metaTags,"Source","publicationTitle");
  4915.  
  4916.  
  4917.         if (metaTags["Authors"]) {
  4918.               var author = Zotero.Utilities.cleanString(metaTags["Authors"]);
  4919.               if (author.substr(0,3).toLowerCase() == "by ") {
  4920.                       author = author.substr(3);
  4921.               }
  4922.  
  4923.               var authors = author.split(" and ");
  4924.               for each(var author in authors) {
  4925.                       var words = author.split(" ");
  4926.                       for (var i in words) {
  4927.                               words[i] = words[i][0].toUpperCase() +words[i].substr(1).toLowerCase();
  4928.                       }
  4929.                       author = words.join(" ");
  4930.  
  4931.         newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  4932.               }
  4933.       }
  4934.  
  4935.        newItem.complete();
  4936. }
  4937.  
  4938. function doWeb(doc,url)
  4939. {
  4940.        var namespace = doc.documentElement.namespaceURI;
  4941.        var nsResolver = namespace ? function(prefix) {
  4942.        if (prefix == ''x'') return namespace; else return null;
  4943.        } : null;
  4944.  
  4945.       var xpath=''//meta[@name="Story_type"]/@content'';
  4946.       var temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  4947.       if(temp)
  4948.       {
  4949.              if(temp.value.indexOf("Story")>-1 || temp.value=="Blog")
  4950.                        {scrape(doc,url);}
  4951.       }
  4952. }');
  4953.  
  4954. REPLACE INTO translators VALUES ('9220fa99-b936-430e-a8ea-43ca6cb04145', '1.0.0b4.r1', '', '2007-07-31 16:45:00', '0', '100', '4', 'AGU Journals', 'Ben Parr','^https?://(?:www.)?agu.org',
  4955. 'function detectWeb(doc,url)
  4956. {
  4957.      var namespace = doc.documentElement.namespaceURI;
  4958.      var nsResolver = namespace ? function(prefix) {
  4959.      if (prefix == ''x'') return namespace; else return null;
  4960.      } : null;
  4961.  
  4962.        var xpath;
  4963.  
  4964.        //abstract
  4965.        xpath=''//p[@id="citation"]'';
  4966.        if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  4967.                { return "journalArticle"; }
  4968.  
  4969.        //full text
  4970.        xpath=''//frameset[@rows="98, *"]'';
  4971.        if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  4972.                { return "journalArticle"; }
  4973.  
  4974.        //issue page
  4975.        xpath=''//tr/td/p[@class="title"]'';
  4976.        if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  4977.                { return "multiple"; }
  4978.  
  4979.        //Search  Page
  4980.        if(doc.title.indexOf("Query Results")>-1)
  4981.                {return "multiple";}
  4982. }
  4983. ',
  4984. 'function fixCaps(s)
  4985. {
  4986.        if(s!='''')
  4987.        {
  4988.                words=Zotero.Utilities.cleanString(s).toLowerCase().split(" ");
  4989.                for (var j = 0 ; j < words.length ; j++)
  4990.                {
  4991.                        if (j==0||(words[j][0] ==words[j][0].toLowerCase()&&words[j]!="or"&&words[j]!="and"&&words[j]!="of"&&words[j]!="in"))
  4992.                                {   words[j]= words[j][0].toUpperCase() +words[j].substr(1);   }
  4993.                }
  4994.                return words.join(" ");
  4995.        }
  4996.        return '''';
  4997. }
  4998.  
  4999. function scrape(doc,url)
  5000. {
  5001.        var namespace = doc.documentElement.namespaceURI;
  5002.        var nsResolver = namespace ? function(prefix) {
  5003.        if (prefix == ''x'') return namespace; else return null;
  5004.        } : null;
  5005.  
  5006.        var newItem=new Zotero.Item("journalArticle");
  5007.        var temp;
  5008.        var xpath;
  5009.        var row;
  5010.        var rows;
  5011.  
  5012.        newItem.url = doc.location.href;
  5013.  
  5014.        xpath=''//p[@id="title"]'';
  5015.        temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  5016.        if(temp)
  5017.                {newItem.title=temp.textContent;}
  5018.  
  5019.        xpath=''//span[@id="published"]'';
  5020.        temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  5021.        if(temp)
  5022.        {
  5023.                temp=Zotero.Utilities.cleanString(temp.textContent).split(" ");;
  5024.                newItem.date=temp[1]+" "+temp[0]+", "+temp[2];
  5025.        }
  5026.  
  5027.        xpath=''//p[@class="author"]'';
  5028.        rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  5029.        var count=0;
  5030.        while(row=rows.iterateNext())
  5031.                {newItem.creators.push(Zotero.Utilities.cleanAuthor(row.textContent,"author"));
  5032.                count++;}
  5033.  
  5034.        xpath=''//tr/td/p'';
  5035.        temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  5036.        var temp2=temp.iterateNext();
  5037.        if(temp2)
  5038.        {
  5039.                for(var n=0;n<(3+2*count);n++)
  5040.                        {temp2=temp.iterateNext();}
  5041.                newItem.abstractNote=Zotero.Utilities.cleanString(temp2.textContent);
  5042.        }
  5043.  
  5044.        xpath=''//p[@id="runhead"]'';
  5045.        temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  5046.        if(temp)
  5047.        {
  5048.                temp=Zotero.Utilities.cleanString(temp.textContent).split(", ");
  5049.                newItem.publicationTitle=fixCaps(temp[0]);
  5050.                for(var n=1;temp[n];n++)
  5051.                {
  5052.                        if(temp[n].indexOf("VOL")>-1)
  5053.                                {newItem.volume=temp[n].replace(''VOL. '','''');}
  5054.                        else if(temp[n].indexOf("NO.")>-1)
  5055.                                {newItem.issue=temp[n].replace(''NO. '','''');}
  5056.                        else if(temp[n].indexOf("doi:")>-1)
  5057.                                {newItem.DOI=temp[n].replace(''doi:'','''');}
  5058.                        else if(temp[n+1])
  5059.                                {newItem.pages=temp[n];}
  5060.                }
  5061.        }
  5062.  
  5063.        xpath=''//p[@id="keywords"]'';
  5064.        temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  5065.        if(temp)
  5066.        {
  5067.                temp=Zotero.Utilities.cleanString(temp.textContent.replace(''Keywords:'',''''));
  5068.                newItem.tags=temp.replace(''.'','''').split(''; '');
  5069.        }
  5070.        xpath=''//p[@id="citation"]/span[@id="journal"]'';
  5071.        temp=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext();
  5072.        if(temp)
  5073.                {newItem.journalAbbreviation=temp.textContent;}
  5074.  
  5075.        newItem.complete();
  5076. }
  5077.  
  5078.  
  5079. function processList(items)
  5080. {
  5081.                items = Zotero.selectItems(items);
  5082.                var uris=new Array();
  5083.  
  5084.               if (!items)
  5085.                        {return true;}
  5086.  
  5087.               for (var i in items)
  5088.                        {uris.push(i);}
  5089.  
  5090.              Zotero.Utilities.processDocuments(uris, scrape,function() {Zotero.done(); });
  5091.              Zotero.wait();
  5092.  
  5093.              return true;
  5094. }
  5095.  
  5096. function doWeb(doc,url)
  5097. {
  5098.      var namespace = doc.documentElement.namespaceURI;
  5099.      var nsResolver = namespace ? function(prefix) {
  5100.      if (prefix == ''x'') return namespace; else return null;
  5101.      } : null;
  5102.  
  5103.        //abstract
  5104.        var xpath=''//p[@id="citation"]'';
  5105.        if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  5106.        {
  5107.                scrape(doc,url);
  5108.                return true;
  5109.        }
  5110.  
  5111.        //full text
  5112.        xpath=''//frameset[@rows="98, *"]'';
  5113.        if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  5114.        {
  5115.                Zotero.Utilities.processDocuments(url+"0.shtml", scrape, function(){ Zotero.done(); });
  5116.                Zotero.wait();
  5117.  
  5118.                return true;
  5119.        }
  5120.  
  5121.        //issue page
  5122.        xpath=''//tr/td/p[@class="title"]'';
  5123.        if(doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext())
  5124.        {
  5125.                var titlerows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  5126.                xpath=''//tr/td/p[@class="pubdate"]/a'';
  5127.                var linkrows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  5128.  
  5129.                var titlerow;
  5130.                var linkrow;
  5131.                var items=new Array();
  5132.  
  5133.                while(titlerow=titlerows.iterateNext())
  5134.                {
  5135.                        linkrow=linkrows.iterateNext();
  5136.                        while(linkrow.textContent.indexOf("Abstract")<0)
  5137.                                {linkrow=linkrows.iterateNext();}
  5138.                        items[linkrow.href]=titlerow.textContent;
  5139.                }
  5140.  
  5141.                return processList(items);
  5142.        }
  5143.  
  5144.  
  5145.        //Search page
  5146.        if(doc.title.indexOf("Query Results")>-1)
  5147.        {
  5148.                //FASTFind Search
  5149.  
  5150.                xpath=''//tr/td/h2'';
  5151.                var tt=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE,null).iterateNext().textContent;
  5152.                if(tt.indexOf("FASTFIND")>-1)
  5153.                {
  5154.                        xpath=''//tr/td[1]/font'';
  5155.                        var citerows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  5156.                        xpath=''//tr/td[2]/font/a'';
  5157.                        var linkrows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  5158.  
  5159.                        var citerow;
  5160.                        var linkrow;
  5161.                        var items=new Array();
  5162.                        var temp;
  5163.                        var title;
  5164.  
  5165.                        while(citerow=citerows.iterateNext())
  5166.                        {
  5167.                                linkrow=linkrows.iterateNext();
  5168.                                items[linkrow.href]=Zotero.Utilities.cleanString(citerow.textContent);
  5169.                        }
  5170.                        return processList(items);
  5171.                }
  5172.                else
  5173.                {
  5174.                        //Advanced Search
  5175.  
  5176.                        xpath=''//tr/td[1]/font/a'';
  5177.                        var titlerows=doc.evaluate(xpath, doc,nsResolver,XPathResult.ANY_TYPE, null);
  5178.                        xpath=''//tr/td[2]/font/a'';
  5179.                        var linkrows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  5180.  
  5181.                        var titlerow;
  5182.                        var linkrow;
  5183.                        var items=new Array();
  5184.                        var temp;
  5185.  
  5186.                        while(titlerow=titlerows.iterateNext())
  5187.                        {
  5188.                                linkrow=linkrows.iterateNext();
  5189.                                while(linkrow.textContent.indexOf("Abstract")<0)
  5190.                                        {linkrow=linkrows.iterateNext();}
  5191.  
  5192.                                items[linkrow.href]=titlerow.textContent;
  5193.                        }
  5194.                        return processList(items);
  5195.                }
  5196.        }
  5197.  
  5198. }
  5199. ');
  5200.  
  5201. REPLACE INTO translators VALUES ('e4fe1596-a8c4-4d09-945f-120c4d83e580', '1.0.0b4.r1', '', '2007-07-31 16:45:00', '0', '100', '4', 'LA Times', 'Ben Parr', '^https?://(?:www.|travel.)?latimes.com', 
  5202. 'function detectWeb(doc, url)
  5203. {
  5204.    var namespace = doc.documentElement.namespaceURI;
  5205.                var nsResolver = namespace ? function(prefix) {
  5206.                if (prefix == ''x'') return namespace; else return null;
  5207.                } : null;
  5208.  
  5209.               var xpath = ''//link[@title="Main"]'';
  5210.               if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext())
  5211.                       {return "newspaperArticle";}
  5212.  
  5213.               if(doc.title.indexOf("Search Results")>-1)
  5214.                       {return "multiple";}
  5215.  
  5216.               xpath = ''//h1'';
  5217.               var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  5218.               var row;
  5219.               while(row=rows.iterateNext())
  5220.               {
  5221.         if(Zotero.Utilities.cleanString(row.textContent.toLowerCase())=="travel")
  5222.                               {return "newspaperArticle";}
  5223.               }
  5224.  
  5225.               return null;
  5226. }', 
  5227. 'function getCount(s)
  5228. {
  5229.       if(!s||s=='''')
  5230.               return 0;
  5231.       if(s.indexOf("Displaying")>-1)
  5232.       {
  5233.               s=s.substr(19);
  5234.               s=s.replace(''.'','''');
  5235.               s=s.split('' to '');
  5236.               return s[1]-s[0]+1;
  5237.       }
  5238.       return 0;
  5239. }
  5240.  
  5241. function processList(items)
  5242. {
  5243.               items = Zotero.selectItems(items);
  5244.               var uris=new Array();
  5245.  
  5246.              if (!items)
  5247.                       {return true;}
  5248.  
  5249.              for (var i in items)
  5250.                       {uris.push(i);}
  5251.  
  5252.             Zotero.Utilities.processDocuments(uris, scrape,function() {Zotero.done(); });
  5253.             Zotero.wait();
  5254.  
  5255.             return true;
  5256. }
  5257.  
  5258. function findDate(s)
  5259. {
  5260.       var words=s.split(" ");
  5261.       var months=new Array("january","febuary","march","april","may","june","july","august","september","october","november","december");
  5262.       for(var n=0;words[n];n++)
  5263.       {
  5264.               for(var m in months)
  5265.                       {if(words[n].toLowerCase()==months[m])
  5266.                               {return words[n]+" "+words[n+1]+" "+words[n+2];}
  5267.                       }
  5268.       }
  5269.       return null;
  5270. }
  5271.  
  5272.  
  5273. function scrape(doc,url)
  5274. {
  5275.       var namespace = doc.documentElement.namespaceURI;
  5276.       var nsResolver = namespace ? function(prefix) {
  5277.               if (prefix == ''x'') return namespace; else return null;
  5278.       } : null;
  5279.  
  5280.       var newItem = new Zotero.Item("newspaperArticle");
  5281.       newItem.publicationTitle = "The Los Angeles Times";
  5282.       newItem.ISSN = "0458-3035";
  5283.  
  5284.       var xpath=''//h2/a'';
  5285.       var t=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext();
  5286.       if(t)
  5287.               {newItem.section=t.textContent; }
  5288.       else
  5289.       {
  5290.               xpath=''//a/img[@alt="WEST"]'';
  5291.               if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext())
  5292.                       {newItem.section="West";}
  5293.               else
  5294.               {
  5295.                       xpath = ''//h1'';
  5296.                       var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  5297.                       if(t=rows.iterateNext())
  5298.                               {newItem.section=t.textContent;}
  5299.               }
  5300.       }
  5301.  
  5302.  
  5303.       xpath=''//h1[last()]'';
  5304.       var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  5305.       if(t=rows.iterateNext())
  5306.               {newItem.title=t.textContent;}
  5307.  
  5308.       newItem.url = url;
  5309.       xpath=''//div[@class="storybyline"]'';
  5310.       var test=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext();
  5311.       if(!test)
  5312.               {xpath=''//p[@class="by-author"]'';}
  5313.       var info=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext().textContent;
  5314.       info=Zotero.Utilities.cleanString(info);
  5315.       var date=findDate(info);
  5316.       if(date)
  5317.       {
  5318.               newItem.date=date;
  5319.               info=info.replace(date,'''');
  5320.       }
  5321.       info=Zotero.Utilities.cleanString(info);
  5322.       if(info.indexOf(", ")>-1)
  5323.       {
  5324.               var phrases=info.split(", ");
  5325.               var a=phrases[0];
  5326.               if (a.substr(0,3).toLowerCase() == "by ")
  5327.                      {a= a.substr(3);}
  5328.               if(a.substr(0,5).toLowerCase()!="from ")
  5329.               {
  5330.                       var authors=a.split(" and ");
  5331.                       var n;
  5332.                       for(n in authors)
  5333.             {newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[n],"author"));}
  5334.               }
  5335.       }
  5336.       else
  5337.       {
  5338.               xpath=''//div[@class="storydeckhead"]/a'';
  5339.               temp=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext();
  5340.               if(temp!=null && temp!='''')
  5341.         {newItem.creators.push(Zotero.Utilities.cleanAuthor(temp.textContent,"author"));}
  5342.       }
  5343.  
  5344.       newItem.attachments.push({document:doc, title:"The Los Angeles Times Snapshot"});
  5345.       newItem.complete();
  5346. }
  5347.  
  5348.  
  5349.  
  5350. function doWeb(doc, url)
  5351. {
  5352.       var namespace = doc.documentElement.namespaceURI;
  5353.       var nsResolver = namespace ? function(prefix) {
  5354.               if (prefix == ''x'') return namespace; else return null;
  5355.       } : null;
  5356.  
  5357.  
  5358.       var xpath=''//link[@title="Main"]'';
  5359.       if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext())
  5360.               {scrape(doc,url); return true;}
  5361.  
  5362.       xpath = ''//h1'';
  5363.       var rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  5364.       var row;
  5365.       while(row=rows.iterateNext())
  5366.       {
  5367.               if(Zotero.Utilities.cleanString(row.textContent.toLowerCase())=="travel")
  5368.                       {scrape(doc,url); return true;}
  5369.       }
  5370.  
  5371.       if(doc.title.indexOf("Search Results")>-1)
  5372.       {
  5373.               xpath=''//div[@class="abstract1"]'';
  5374.               var count=0;
  5375.               rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  5376.               while(row=rows.iterateNext())
  5377.               {
  5378.                       count=getCount(row.textContent);
  5379.                       if(count!=0)
  5380.                               {break;}
  5381.               }
  5382.               if(count==0)
  5383.               {
  5384.                       xpath=''//td[@class="abstract1"]'';
  5385.                       rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  5386.                       while(row=rows.iterateNext())
  5387.                       {
  5388.                               count=getCount(row.textContent);
  5389.                               if(count!=0)
  5390.                                       {break;}
  5391.                       }
  5392.               }
  5393.  
  5394.               if(count>0)
  5395.               {
  5396.                       var items=new Array();
  5397.                       xpath=''//div[@class="headline14"]/a'';
  5398.                       rows=doc.evaluate(xpath, doc, nsResolver,XPathResult.ANY_TYPE, null);
  5399.                       while(row=rows.iterateNext())
  5400.                       {
  5401.                               if(count==0)
  5402.                                       {break;}
  5403.                               if(row.href.indexOf("/travel/")<0)
  5404.                 {items[row.href]=Zotero.Utilities.cleanString(row.textContent);}
  5405.                               count--;
  5406.                       }
  5407.  
  5408.                       return processList(items);
  5409.               }
  5410.       }
  5411. }');
  5412.  
  5413. REPLACE INTO translators VALUES ('1a3e63b2-0adf-4c8e-928b-c58c2594b45d', '1.0.0b4.r1', '', '2008-01-09 20:00:00', '0', '100', '4', 'BioMed Central and More', 'Ben Parr', 'http://[^/]*(biomedcentral|actavetscand|aidsrestherapy|almob|ann-clinmicrob|annals-general-psychiatry|asir-journal|arthritis-research|anzhealthpolicy|behavioralandbrainfunctions|bjoc.beilstein-journals|biology-direct|biomagres|bio-diglib|biomedical-engineering-online|bpsmedicine|breast-cancer-research|cancerci|cbmjournal|cardiab|cardiovascularultrasound|cellandchromosome|biosignaling|celldiv|cerebrospinalfluidresearch|journal.chemistrycentral|capmh|cmjournal|chiroandosteo|clinicalmolecularallergy|cpementalhealth|comparative-hepatology|conflictandhealth|resource-allocation|coughjournal|ccforum|cytojournal|diagnosticpathology|dynamic-med|ete-online|ehjournal|epi-perspectives|filariajournal|frontiersinzoology|gvt-journal|genomebiology|geochemicaltransactions|globalizationandhealth|harmreductionjournal|head-face-med|hqlo|health-policy-systems|human-resources-health|immunityageing|immunome-research|implementationscience|infectagentscancer|internationalbreastfeedingjournal|equityhealthj|ijbnpa|ij-healthgeographics|issoonline|jautoimdis|jbiol|j-biomed-discovery|jbppni|carcinogenesis|cardiothoracicsurgery|jcircadianrhythms|ethnobiomed|jexpclinassistreprod|jibtherapies|journal-inflammation|jmedicalcasereports|jmolecularsignaling|jnanobiotechnology|jnrbm|jneuroengrehab|jneuroinflammation|occup-med|josr-online|translational-medicine|kinetoplastids|lipidworld|malariajournal|medimmunol|microbialcellfactories|molecular-cancer|molecularneurodegeneration|molecularpain|neuraldevelopment|nonlinearbiomedphys|nuclear-receptor|nutritionandmetabolism|nutritionj|ojrd|om-pc|particleandfibretoxicology|ped-rheum|peh-med|plantmethods|pophealthmetrics|proteomesci|ro-journal|rbej|reproductive-health-journal|respiratory-research|retrovirology|salinesystems|scoliosisjournal|scfbm|substanceabusepolicy|tbiomed|thrombosisjournal|trialsjournal|virologyj|wjes|wjso)\.(com|org|net)', 
  5414. 'function detectWeb(doc,url)
  5415. {
  5416.     var namespace = doc.documentElement.namespaceURI;
  5417.         var nsResolver = namespace ? function(prefix) {
  5418.         if (prefix == "x" ) return namespace; else return null;
  5419.         } : null;
  5420.         
  5421.         var xpath=''//meta[@name="citation_fulltext_html_url"]'';
  5422.         
  5423.         //Single
  5424.         if (doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) 
  5425.             {return "journalArticle";}
  5426.             
  5427.         
  5428.         //Multiple
  5429.         xpath=''//a[@class="hiddenlink"][span[@class="xcitationtitle"][b]]'';
  5430.     xpath+='' | //span[@class="xcitationtitle2"]/a[@class="hiddenlink"]'';
  5431.     xpath+='' | //div[@class="bodytext"]/a[@class="hiddenlink"][font/b]'';
  5432.     xpath+='' | //p[@class="bodytext"]/a[@class="hiddenblack"][b]'';
  5433.     xpath+='' | //div[@class="bodytext"]/a[@class="hiddenblack"][b]'';
  5434.     xpath+='' | //div[@class="bodytext"]/a[@class="hiddenlink"][font/b]'';
  5435.     
  5436.     var rows=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  5437.     var row;
  5438.     var link;
  5439.     while(row=rows.iterateNext())
  5440.     {
  5441.         link=row.href;
  5442.         if(link.indexOf("pubmed")<0 && link.substr(link.length-4)!=".pdf" && link.indexOf("blogs.")<0)
  5443.             {return "multiple";}
  5444.     }
  5445.     
  5446. }', 
  5447. 'function parseRIS(getURL)
  5448. {  
  5449.     Zotero.Utilities.HTTP.doGet(getURL, function(text){
  5450.         // load translator for RIS
  5451.         var translator = Zotero.loadTranslator ("import");
  5452.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  5453.         translator.setString(text);
  5454.         translator.translate();
  5455.         Zotero.done();
  5456.     }, function() {});
  5457.  
  5458.     Zotero.wait();
  5459. }
  5460.  
  5461. function doWeb(doc,url)
  5462. {
  5463.     var namespace = doc.documentElement.namespaceURI;
  5464.         var nsResolver = namespace ? function(prefix) {
  5465.         if (prefix == "x" ) return namespace; else return null;
  5466.         } : null;
  5467.         
  5468.         var xpath=''//meta[@name="citation_fulltext_html_url"]/@content'';
  5469.         var rows;
  5470.         var row=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  5471.         if (row) 
  5472.         {
  5473.             //Single Article            
  5474.             var url=row.textContent+"/citation";
  5475.             Zotero.Utilities.HTTP.doPost(url, ''include=cit&format=refman&direct=on&submit=Download+references&action=submit'', function(text)
  5476.                 {parseRIS(url+''?include=cit&format=refman&direct=on&submit=Download+references&action=submit'');});
  5477.    
  5478.             Zotero.wait();
  5479.             return true;
  5480.     }
  5481.      
  5482.      
  5483.      //Multiple
  5484.         xpath=''//a[@class="hiddenlink"][span[@class="xcitationtitle"][b]]'';
  5485.     xpath+='' | //span[@class="xcitationtitle2"]/a[@class="hiddenlink"]'';
  5486.     xpath+='' | //div[@class="bodytext"]/a[@class="hiddenlink"][font/b]'';
  5487.     xpath+='' | //p[@class="bodytext"]/a[@class="hiddenblack"][b]'';
  5488.     xpath+='' | //div[@class="bodytext"]/a[@class="hiddenblack"][b]'';
  5489.     xpath+='' | //div[@class="bodytext"]/a[@class="hiddenlink"][font/b]'';
  5490.  
  5491.     rows=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  5492.     var items=new Array();
  5493.     var link;
  5494.     var t;
  5495.     while(row=rows.iterateNext())
  5496.     {
  5497.         link=row.href;
  5498.         if(link.indexOf("pubmed")<0 && link.substr(link.length-4)!=".pdf" && link.indexOf("blogs.")<0)
  5499.         {
  5500.             t=link.split(''/'');
  5501.             if(t[t.length-1].indexOf("comments#")>-1)
  5502.                 {link=t.slice(0,t.length-1).join(''/'');}
  5503.             items[link.replace("/abstract","")+"/citation"]=row.textContent;
  5504.         }
  5505.     }
  5506.     
  5507.     items = Zotero.selectItems(items);
  5508.            var uris=new Array();
  5509.            if (!items)
  5510.                {return true;}
  5511.  
  5512.         for (var i in items)
  5513.                {uris.push(i);}
  5514.  
  5515.            Zotero.Utilities.HTTP.doPost(uris, "include=cit&format=refman&direct=on&submit=Download+references&action=submit", function(text)
  5516.            {
  5517.                for (var j = 0 ; j < uris.length ; j++)
  5518.                    {parseRIS(uris[j] + "?include=cit&format=refman&direct=on&submit=Download+references&action=submit");}
  5519.            });
  5520.        
  5521.            Zotero.wait();
  5522. }
  5523. ');
  5524.  
  5525. REPLACE INTO translators VALUES ('a1a97ad4-493a-45f2-bd46-016069de4162', '1.0.0b4.r1', '', '2007-07-03 18:05:11', '0', '100', '4', 'OpticsInfoBase', 'Ben Parr','^https?://(?:www\.)?opticsinfobase.org',
  5526. 'function detectWeb(doc,url)
  5527. {
  5528.        var namespace = doc.documentElement.namespaceURI;
  5529.        var nsResolver = namespace ? function(prefix) {
  5530.        if (prefix == ''x'') return namespace; else return null;
  5531.        } : null;
  5532.  
  5533.  
  5534.         var xpath=''//div[@id="abstract"]/p/strong''
  5535.         var rows= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  5536.         var row;
  5537.         while(row=rows.iterateNext())
  5538.         {
  5539.                 if(row.textContent=="Citation")
  5540.                        {return "journalArticle";}
  5541.         }
  5542.  
  5543.         xpath=''//form[@id="searchform"]/table/tbody/tr/td[1]/h1'';
  5544.        var temp=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext();
  5545.        if(temp&&temp.textContent=="Search Results")
  5546.                {return "multiple";}
  5547. }',
  5548. 'function processList(items)
  5549. {
  5550.        items = Zotero.selectItems(items);
  5551.        var uris=new Array();
  5552.        if (!items)
  5553.                {return true;}
  5554.  
  5555.        for (var i in items)
  5556.                {uris.push(i);}
  5557.  
  5558.        Zotero.Utilities.processDocuments(uris, scrape,function() {Zotero.done(); });
  5559.        Zotero.wait();
  5560.  
  5561.        return true;
  5562. }
  5563.  
  5564.  
  5565. function scrape(doc,url)
  5566. {
  5567.        var namespace = doc.documentElement.namespaceURI;
  5568.        var nsResolver = namespace ? function(prefix) {
  5569.        if (prefix == ''x'') return namespace; else return null;
  5570.        } : null;
  5571.  
  5572.        var newItem=new Zotero.Item("journalArticle");
  5573.  
  5574.        var xpath=''//div[@id="abstract"]/h1'';
  5575.        var temp=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext();
  5576.        if(temp)
  5577.        {
  5578.                temp=temp.textContent;
  5579.                if(temp[temp.length-1]==".")
  5580.                        {temp=temp.substr(0,temp.length-1);}
  5581.                newItem.title=Zotero.Utilities.cleanString(temp);
  5582.        }
  5583.  
  5584.        xpath=''//div[@id="abstract"]/p'';
  5585.        var rows= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  5586.        var row;
  5587.        while(row=rows.iterateNext())
  5588.        {
  5589.                temp=row.textContent;
  5590.                if(temp.substr(0,8)=="Abstract")
  5591.                {
  5592.                        temp=temp.replace("Abstract","");
  5593.                        temp=Zotero.Utilities.cleanString(temp);
  5594.                        temp=Zotero.Utilities.cleanTags(temp);
  5595.                        newItem.abstractNote=temp;
  5596.                }
  5597.        }
  5598.  
  5599.        xpath=''//div[@id="abstract"]/p'';
  5600.        rows= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  5601.        while(row=rows.iterateNext())
  5602.        {
  5603.                temp=Zotero.Utilities.cleanString(row.textContent);
  5604.                if(temp.substr(0,8)=="Citation")
  5605.                        {temp=temp.split(" ");
  5606.                        newItem.url=temp[temp.length-1];}
  5607.        }
  5608.  
  5609.        xpath=''//div[@id="abstract"]/h3''
  5610.        temp=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext();
  5611.        if(temp)
  5612.        {
  5613.                temp=temp.textContent;
  5614.                temp=temp.replace(" and ",",");
  5615.                temp=temp.replace(" and,",",");
  5616.                var authors=temp.split("\n")[0].split(",");
  5617.                for(var a in authors)
  5618.                {
  5619.                        if(Zotero.Utilities.cleanString(authors[a]))
  5620.                                {newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[a], "author"));}
  5621.                }
  5622.  
  5623.                temp=temp.replace(temp.split("\n")[0],'''');
  5624.                temp=Zotero.Utilities.cleanString(temp);
  5625.                var i=temp.split(",");
  5626.                for(var b in i)
  5627.                {
  5628.                        if(i[b].indexOf("Vol. ")>-1)
  5629.                                {newItem.volume=i[b].replace("Vol. ","");}
  5630.                        else if(i[b].indexOf("Issue ")>-1)
  5631.                                {newItem.issue=i[b].replace("Issue ","");}
  5632.                        else if(i[b].indexOf("pp. ")>-1)
  5633.                        {
  5634.                                var pages=i[b];
  5635.                                if(pages[pages.length-1]=="-")
  5636.                                        {pages=pages.substr(0,pages.length-1);}
  5637.                                newItem.pages=pages.replace("pp. ","");
  5638.                        }
  5639.                }
  5640.        }
  5641.        xpath=''//div[@id="abstract"]'';
  5642.        temp=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext();
  5643.        if(temp)
  5644.        {
  5645.                temp=Zotero.Utilities.cleanString(temp.textContent);
  5646.                if(temp.substr(0,16)=="Conference Paper")
  5647.                {
  5648.                        newItem.itemType="conferencePaper";
  5649.                        xpath=''//div[@id="abstract"]'';
  5650.                        temp=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext().textContent;
  5651.                        var journalsub=false;
  5652.                        var next=true;
  5653.                        temp=temp.replace("Conference Paper","");
  5654.                        temp=temp.split("\n");
  5655.                        for(var  x in temp)
  5656.                        {
  5657.                                temp[x]=Zotero.Utilities.cleanString(temp[x]);
  5658.                                if(temp[x]&&!journalsub)
  5659.                                        {newItem.publisher=temp[x];     journalsub=true;}
  5660.                                else if(temp[x]&&next)
  5661.                                        {next=false;}
  5662.                                else if(temp[x]&&!next)
  5663.                                        {newItem.date=temp[x];          break;}
  5664.                        }
  5665.                }
  5666.                else
  5667.                {
  5668.                        xpath=''//div[@id="abstract"]/p'';
  5669.                        rows= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  5670.                        while(row=rows.iterateNext())
  5671.                        {
  5672.                                temp=Zotero.Utilities.cleanString(row.textContent);
  5673.                                if(temp.substr(0,8)=="Citation")
  5674.                                {
  5675.                                        temp=temp.replace("Citation","");
  5676.                                        temp=Zotero.Utilities.cleanString(temp);
  5677.                                        temp=temp.replace(newItem.title,'''');
  5678.                                        var journal=temp.split('',"'');
  5679.                                        if(journal[1])
  5680.                                        {
  5681.                                                journal=journal[1];
  5682.                                                var c=journal.split(",");
  5683.                                                journal=c[0];
  5684.                                                if(c[1])
  5685.                                                {
  5686.                                                        var year=c[1].split("(");
  5687.                                                        if(year[1])
  5688.                                                        {newItem.date=Zotero.Utilities.cleanString(year[1].split(")")[0]);}
  5689.                                                }
  5690.  
  5691.                                                journal=journal.replace(newItem.volume,'''');
  5692.                                                newItem.publicationTitle=Zotero.Utilities.cleanString(journal);
  5693.                                        }
  5694.                                        break;
  5695.                                }
  5696.                        }
  5697.                }
  5698.        }
  5699.        newItem.complete();
  5700.  
  5701. }
  5702.  
  5703. function doWeb(doc,url)
  5704. {
  5705.        var namespace = doc.documentElement.namespaceURI;
  5706.        var nsResolver = namespace ? function(prefix) {
  5707.        if (prefix == ''x'') return namespace; else return null;
  5708.        } : null;
  5709.  
  5710.        var xpath=''//div[@id="abstract"]/p/strong''
  5711.        var rows= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  5712.        var row;
  5713.        while(row=rows.iterateNext())
  5714.        {
  5715.                if(row.textContent=="Citation")
  5716.                        {scrape(doc,url);return true;}
  5717.        }
  5718.  
  5719.        xpath=''//form[@id="searchform"]/table/tbody/tr/td[1]/h1'';
  5720.        var temp=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext();
  5721.        if(temp&&temp.textContent=="Search Results")
  5722.        {
  5723.                var items=new Array();
  5724.                xpath=''//div[@id="col2"]/p/strong/a'';
  5725.                rows=doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  5726.                while(row=rows.iterateNext())
  5727.                        {items[row.href]=Zotero.Utilities.cleanString(row.textContent);}
  5728.  
  5729.                processList(items);
  5730.        }
  5731. }');
  5732.  
  5733. REPLACE INTO translators VALUES ('b61c224b-34b6-4bfd-8a76-a476e7092d43', '1.0.0b4.r5', '', '2008-01-10 21:00:00', '0', '100', '4', 'SSRN', 'Michael Berkowitz', '^http://papers\.ssrn\.com/', 
  5734. 'function detectWeb(doc, url)    {
  5735.     var namespace=doc.documentElement.namespaceURI;
  5736.     var nsResolver=namespace?function(prefix)    {
  5737.         return (prefix=="x")?namespace:null;
  5738.     }:null;
  5739.     
  5740.     if (doc.evaluate(''//font/strong/a[substring(@class, 1, 4) = "text"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  5741.         return "multiple";
  5742.     } else if (url.indexOf("abstract_id") != -1) {
  5743.         return "journalArticle";
  5744.     }
  5745. }', 
  5746. 'function doWeb(doc, url) {
  5747.     var namespace=doc.documentElement.namespaceURI;
  5748.     var nsResolver=namespace?function(prefix)    {
  5749.         return (prefix=="x")?namespace:null;
  5750.     }:null;
  5751.     
  5752.     var uris = new Array();
  5753.     
  5754.     if (doc.evaluate(''//font/strong/a[substring(@class, 1, 4) = "text"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  5755.         var items = new Object();
  5756.         var xpath = ''//font/strong/a[substring(@class, 1, 4) = "text"]'';
  5757.         var titles = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  5758.         var next_title = titles.iterateNext();
  5759.         while (next_title) {
  5760.             items[next_title.href] = next_title.textContent;
  5761.             next_title = titles.iterateNext();
  5762.         }
  5763.         items = Zotero.selectItems(items);
  5764.         for (var i in items) {
  5765.             uris.push(i);
  5766.         }
  5767.     } else {
  5768.         uris.push(url);
  5769.     }
  5770.     
  5771.     Zotero.Utilities.processDocuments(uris, function(newDoc) {
  5772.         var id = newDoc.location.href.match(/abstract_id=(\d+)/)[1];
  5773.         var newURL = ''http://papers.ssrn.com/sol3/RefExport.cfm?abstract_id='' + id + ''&format=3'';
  5774.         Zotero.Utilities.HTTP.doGet(newURL, function(text) {
  5775.             var ris=text.match(/<input type=\"Hidden\"\s+name=\"hdnContent\"\s+value=\"([^"]*)\">/)[1];
  5776.             var trans=Zotero.loadTranslator("import");
  5777.             trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  5778.             trans.setString(ris);
  5779.             trans.setHandler("itemDone", function(obj, item) {
  5780.                 item.itemType = "journalArticle";
  5781.                 item.complete();
  5782.             });
  5783.             trans.translate();
  5784.         });
  5785.     }, function() {Zotero.done;});
  5786.     Zotero.wait();
  5787. }');
  5788.  
  5789. REPLACE INTO translators VALUES ('1c34744d-690f-4cac-b31b-b7f0c90ac14d', '1.0.0b3.r1', '', '2007-12-21 16:00:00', '0', '100', '4', 'RSC Publishing', 'Ramesh Srigiriraju', 'http://(:?www\.|google\.)?rsc\.org/', 
  5790. 'function detectWeb(doc, url)    {
  5791.     var namespace=doc.documentElement.namespaceURI;
  5792.     var nsResolver=namespace?function(prefix)    {
  5793.         return (prefix=="x")?namespace:null;
  5794.     }:null;
  5795.     var journalreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/(:?J|j)ournals");
  5796.     if(journalreg.test(url))    {
  5797.         var browspath=''//div/p/a[text()="Use advanced search"]'';
  5798.         if(doc.evaluate(browspath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  5799.             return "multiple";
  5800.         var searchpath=''//a[text()="Back to Search Form"]'';
  5801.         if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  5802.             return "multiple";
  5803.         var singpath=''//ul/li/a[text()="HTML Article" or text()="PDF"]'';
  5804.         if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  5805.             return "journalArticle";
  5806.     }
  5807.     var magpath=''//div/h3[text()="Link to journal article"]'';
  5808.     if(doc.evaluate(magpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  5809.         return "magazineArticle";
  5810.     var magbrows=''//div/h4[@class="newstitle"]/a'';
  5811.     if(doc.evaluate(magbrows, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  5812.         return "multiple";
  5813.     var magsearch=''//p[@class="more"]/strong/a[text()="Search RSC journals"]'';
  5814.     if(doc.evaluate(magsearch, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  5815.         return "multiple";
  5816.     var bookreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/e(:?B|b)ooks");
  5817.     if(bookreg.test(url))    {
  5818.         var pagepath=''//title/text()'';
  5819.         var page=doc.evaluate(pagepath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  5820.         if((page=="Books in a publication year")||(page=="Subject Area Books")||(page=="A - Z Index")
  5821.             ||(page=="Book Series"))
  5822.                 return "multiple";
  5823.         var chappath=''//dt/img[@alt="Chapter"]'';
  5824.         var singpath=''//h3[text()="Table of Contents"]'';
  5825.         if(doc.evaluate(chappath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  5826.             return "bookSection";
  5827.         else if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  5828.             return "book";
  5829.     }
  5830.     var searchpath=''//div/p[@class="title"][text()="Search Results"]'';
  5831.     if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  5832.         return "multiple";
  5833. }', 
  5834. 'function doChap(newItem, chaptext)    {
  5835.     var chapdata=chaptext.split("<br>");
  5836.     for(var pos=chapdata.length-2; pos>=0; pos--)    {
  5837.         chapdata[pos]=Zotero.Utilities.cleanTags(chapdata[pos]);
  5838.         if(chapdata[pos].indexOf("Editors")!=-1)    {
  5839.             var editors=chapdata[pos].split(",");
  5840.             for(var i=0; i<=editors.length-1; i++)    {
  5841.                 editors[i]=Zotero.Utilities.cleanString(editors[i]);
  5842.                 var names=editors[i].split(" ");
  5843.                 var creators=new Array();
  5844.                 if(i==0)
  5845.                     creators.firstName=names[1];
  5846.                 else
  5847.                     creators.firstName=names[0];
  5848.                 creators.lastName=names[names.length-1];
  5849.                 creators.creatorType="editor";
  5850.                 newItem.creators.push(creators);
  5851.             }
  5852.         }
  5853.         if(chapdata[pos].indexOf("Authors")!=-1)    {
  5854.             var authors=chapdata[pos].split(",");
  5855.             for(var i=0; i<=authors.length-1; i++)    {
  5856.                 authors[i]=Zotero.Utilities.cleanString(authors[i]);
  5857.                 var names=authors[i].split(" ");
  5858.                 var creators=new Array();
  5859.                 if(i==0)
  5860.                     creators.firstName=names[1];
  5861.                 else
  5862.                     creators.firstName=names[0];
  5863.                 creators.lastName=names[names.length-1];
  5864.                 creators.creatorType="editor";
  5865.                 newItem.creators.push(creators);
  5866.             }
  5867.         }
  5868.         if(chapdata[pos].indexOf("DOI")!=-1)
  5869.             newItem.itemID=chapdata[pos].substring(chapdata[pos].indexOf("1"));
  5870.         if(chapdata[pos].indexOf("Book")!=-1)
  5871.             newItem.bookTitle=chapdata[pos].substring(chapdata[pos].indexOf(" ")+1);
  5872.     }
  5873. }
  5874. function doBook(newItem, bookdata)    {
  5875.     var fields=bookdata.split("<br>");
  5876.     for(var pos=fields.length-2; pos>=0; pos--)    {
  5877.         fields[pos]=Zotero.Utilities.cleanTags(fields[pos]);
  5878.         if(fields[pos].indexOf("Volume")!=-1)    {
  5879.             var i=fields[pos].lastIndexOf(";");
  5880.             var vol;
  5881.             if(i!=-1)
  5882.                 vol=fields[pos].substring(i+1);
  5883.             else
  5884.                 vol=fields[pos].substring(fields[pos].lastIndexOf(" "));
  5885.             newItem.volume=Zotero.Utilities.cleanString(vol);
  5886.         }
  5887.         if(fields[pos].indexOf("Edition")!=-1)    {
  5888.             var i=fields[pos].lastIndexOf(";");
  5889.             if(i!=-1)
  5890.                 ed=fields[pos].substring(i+1);
  5891.             else
  5892.                 ed=fields[pos].substring(fields[pos].lastIndexOf(" "));
  5893.             newItem.edition=Zotero.Utilities.cleanString(ed);
  5894.         }
  5895.         if(fields[pos].indexOf("Copyright")!=-1)    {
  5896.             var i=fields[pos].lastIndexOf(";");
  5897.             var date;
  5898.             if(i!=-1)
  5899.                 date=fields[pos].substring(i+1);
  5900.             else
  5901.                 date=fields[pos].substring(fields[pos].indexOf(":")+2);
  5902.             newItem.date=Zotero.Utilities.cleanString(date);
  5903.         }
  5904.         if(fields[pos].indexOf("ISBN")!=-1&&fields[pos].indexOf("print")!=-1)    {
  5905.             var i=fields[pos].lastIndexOf(";");
  5906.             var isbn;
  5907.             if(i!=-1)
  5908.                 isbn=fields[pos].substring(i+1);
  5909.             else
  5910.                 isbn=fields[pos].substring(fields[pos].indexOf(":")+2);
  5911.             newItem.ISBN=Zotero.Utilities.cleanString(isbn);
  5912.         }
  5913.         if(fields[pos].indexOf("Author")!=-1||fields[pos].indexOf("Editor")!=-1)    {
  5914.             var authors=fields[pos].split(",");
  5915.             for(var i=0; i<=authors.length-1; i++)    {
  5916.                 authors[i]=Zotero.Utilities.cleanString(authors[i]);
  5917.                 var names=authors[i].split(" ");
  5918.                 var creators=new Array();
  5919.                 creators.firstName=names[0];
  5920.                 creators.lastName=names[names.length-2];
  5921.                 if(names[names.length-1]=="(Editor)")
  5922.                     creators.creatorType="editor";
  5923.                 if(names[names.length-1]=="(Author)")
  5924.                     creators.creatorType="author";
  5925.                 newItem.creators.push(creators);
  5926.             }
  5927.         }
  5928.         if(fields[pos].indexOf("DOI:")!=-1)
  5929.             newItem.itemID=fields[pos].substring(fields[pos].indexOf("1"));
  5930.     }
  5931. }
  5932. function doWeb(doc, url)    {
  5933.     var namespace=doc.documentElement.namespaceURI;
  5934.     var nsResolver=namespace?function(prefix)    {
  5935.         return (prefix=="x")?namespace:null;
  5936.     }:null;
  5937.     var journalreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/(:?J|j)ournals");
  5938.     if(journalreg.test(url))    {
  5939.         var browspath=''//div/p/a[text()="Use advanced search"]'';
  5940.         if(doc.evaluate(browspath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  5941.             var doipath=''//p[strong/text()="DOI:"]/a/text()'';
  5942.             var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  5943.             var titlpath=''//p/strong/a'';
  5944.             var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  5945.             var items=new Array();
  5946.             var doi;
  5947.             while(doi=dois.iterateNext())
  5948.                 items[doi.nodeValue]=Zotero.Utilities.cleanString(titles.iterateNext().textContent);
  5949.             items=Zotero.selectItems(items);
  5950.             var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?";
  5951.             for(var codes in items)    {
  5952.                 var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?ManuscriptID=";
  5953.                 string+=codes.substring(codes.indexOf("/")+1)+"&type=refman";
  5954.                 Zotero.Utilities.HTTP.doGet(string, function(text)    {
  5955.                     var trans=Zotero.loadTranslator("import");
  5956.                     trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  5957.                     // fix bad Y1 tags, which have wrong spacing and typically terminate with "///"
  5958.                     text = text.replace("Y1 -  ", "Y1  - ");
  5959.                     trans.setString(text);
  5960.                     trans.translate();
  5961.                     Zotero.done();    
  5962.                 });
  5963.             }
  5964.         }
  5965.         var searchpath=''//a[text()="Back to Search Form"]'';
  5966.         if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  5967.             var doipath=''//p[strong/text()="DOI:"]/a/text()'';
  5968.             var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  5969.             var titlpath=''//form/div/h5'';
  5970.             var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  5971.             var title;
  5972.             var items=new Array();
  5973.             while(title=titles.iterateNext())
  5974.                 items[dois.iterateNext().nodeValue]=title.textContent;
  5975.             items=Zotero.selectItems(items);
  5976.             var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?";
  5977.             for(var codes in items)    {
  5978.                 var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?ManuscriptID=";
  5979.                 string+=codes.substring(codes.indexOf("/")+1)+"&type=refman";
  5980.                 Zotero.Utilities.HTTP.doGet(string, function(text)    {
  5981.                     var trans=Zotero.loadTranslator("import");
  5982.                     trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  5983.                     // fix bad Y1 tags, which have wrong spacing and typically terminate with "///"
  5984.                     text = text.replace("Y1 -  ", "Y1  - ");
  5985.                     trans.setString(text);
  5986.                     trans.translate();
  5987.                     Zotero.done();
  5988.                 });
  5989.             }
  5990.         }
  5991.         var singpath=''//ul/li/a[text()="HTML Article" or text()="PDF"]'';
  5992.         if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  5993.             var doipath=''//div/p[strong/text()="DOI:"]'';
  5994.             var text=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  5995.             var doi=text.substring(text.indexOf("/")+1);
  5996.             var string="http://www.rsc.org/delivery/_ArticleLinking/refdownload.asp?ManuscriptID="+doi;
  5997.             string+="&type=refman";
  5998.             Zotero.Utilities.HTTP.doGet(string, function(text)    {
  5999.                 var trans=Zotero.loadTranslator("import");
  6000.                 trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  6001.                 // fix bad Y1 tags, which have wrong spacing and typically terminate with "///"
  6002.                 text = text.replace("Y1 -  ", "Y1  - ");                
  6003.                 trans.setString(text);
  6004.                 trans.setHandler("itemDone", function(obj, newItem)    {
  6005.                     var url2=newItem.url;
  6006.                     var stringy;
  6007.                     var archpath=''//div[h3/text()="Journals archive purchaser access"]'';
  6008.                     if(doc.evaluate(archpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  6009.                         var stringy="http://www.rsc.org/ejarchive/";
  6010.                         stringy+=url2.substring(url2.lastIndexOf("/")+1)+".pdf";
  6011.                         newItem.attachments.push({url:stringy, title:"RSC PDF", mimeType:"application/pdf"});
  6012.                     }
  6013.                     else    {
  6014.                         var stringy="http://www.rsc.org/delivery/_ArticleLinking/DisplayArticleForFree.cfm?doi=";
  6015.                         stringy+=url2.substring(url2.lastIndexOf("/")+1);
  6016.                         newItem.attachments.push({url:stringy, title:"RSC PDF", mimeType:"application/pdf"});
  6017.                     }
  6018.                     newItem.complete();
  6019.                 });
  6020.                 trans.translate();
  6021.                 Zotero.done();
  6022.             });
  6023.         }
  6024.     }
  6025.     var magpath=''//div/h3[text()="Link to journal article"]'';
  6026.     if(doc.evaluate(magpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  6027.         var newItem=new Zotero.Item("magazineArticle");
  6028.         var titlpath=''//div/h2/div[@class="header"]/text()'';
  6029.         newItem.title=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  6030.         var authpath=''//em/text()'';
  6031.         var auth=doc.evaluate(authpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  6032.         var authors=auth.split(",");
  6033.         if(newItem.title.indexOf("Interview")==-1)
  6034.             for(var i=0; i<=authors.length-1; i++)    {
  6035.                 authors[i]=Zotero.Utilities.cleanString(authors[i]);
  6036.                 var names=authors[i].split(" ");
  6037.                 var creator=new Array();
  6038.                 creator.firstName=names[0];
  6039.                 creator.lastName=names[names.length-1];
  6040.                 newItem.creators.push(creator);
  6041.             }
  6042.         var textpath=''//div[@id="content"]//text()'';
  6043.         var text=doc.evaluate(textpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6044.         var temp;
  6045.         while(temp=text.iterateNext())
  6046.             if(temp.nodeValue==newItem.title)    {
  6047.                 newItem.date=text.iterateNext().nodeValue;
  6048.                 break;
  6049.             }
  6050.         var datapath= ''//div[@id="breadcrumbs"]/ul/li/a/text()'';
  6051.         var data=doc.evaluate(datapath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6052.         var prev;
  6053.         while(temp=data.iterateNext())    {
  6054.             if(temp.nodeValue.indexOf("Chemi")!=-1)
  6055.                 newItem.publication=temp.nodeValue;
  6056.             prev=temp;
  6057.         }
  6058.         newItem.issue=prev.nodeValue;
  6059.         newItem.complete();
  6060.     }
  6061.     var magbrows=''//div/h4[@class="newstitle"]/a'';
  6062.     if(doc.evaluate(magbrows, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  6063.         var titlpath=''//h4[@class="newstitle"]/a'';
  6064.         var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6065.         var title;
  6066.         var items=new Array();
  6067.         while(title=titles.iterateNext())
  6068.             items[title.href]=title.textContent;
  6069.         items=Zotero.selectItems(items);
  6070.         for(var linx in items)    {
  6071.             var newItem=new Zotero.Item("magazineArticle");
  6072.             newItem.url=linx;
  6073.             newItem.title=items[linx];
  6074.             var datepath=''//div[h4/a/text()="''+items[linx]+''"]/h4[@class="datetext"]/text()'';
  6075.             newItem.date=doc.evaluate(datepath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  6076.             var datapath= ''//div[@id="breadcrumbs"]/ul/li/a/text()'';
  6077.             var data=doc.evaluate(datapath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6078.             var prev;
  6079.             var temp;
  6080.             while(temp=data.iterateNext())    {
  6081.                 if(temp.nodeValue.indexOf("Chemi")!=-1)
  6082.                     newItem.publication=temp.nodeValue;
  6083.                 prev=temp;
  6084.             }
  6085.             if(prev.nodeValue!=newItem.publication)
  6086.                 newItem.issue=prev.nodeValue;
  6087.             newItem.complete();
  6088.         }
  6089.     }
  6090.     var magsearch=''//p[@class="more"]/strong/a[text()="Search RSC journals"]'';
  6091.     if(doc.evaluate(magsearch, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  6092.         var titlpath=''//div/p/a'';
  6093.         var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6094.         titlpath=''//blockquote/p/a[span/@class="l"]'';
  6095.         var titles2=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null)
  6096.         var title;
  6097.         var items=new Array();
  6098.         while(title=titles.iterateNext())
  6099.             items[title.href]=title.textContent;
  6100.         while(title=titles2.iterateNext())
  6101.             items[title.href]=title.textContent;
  6102.         items=Zotero.selectItems(items);
  6103.         for(var linx in items)    {
  6104.             var newItem=new Zotero.Item("magazineArticle");
  6105.             newItem.url=linx;
  6106.             newItem.title=items[linx];
  6107.             newItem.complete();
  6108.         }
  6109.     }
  6110.     var bookreg=new RegExp("http://(:?www\.)?rsc\.org/(:?P|p)ublishing/e(:?B|b)ooks");
  6111.     if(bookreg.test(url))    {
  6112.         var browspath=''//title/text()'';
  6113.         var page=doc.evaluate(browspath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  6114.         if((page=="Books in a publication year")||(page=="Subject Area Books")||(page=="A - Z Index")
  6115.             ||(page=="Book Series"))    {
  6116.             var doipath=''//dd/p/a/text()'';
  6117.             var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6118.             var items=new Array();
  6119.             var title;
  6120.             while(title=dois.iterateNext())    {
  6121.                 var doi=dois.iterateNext().nodeValue;
  6122.                 items[doi.substring(doi.indexOf("1"))]=title.nodeValue;
  6123.             }
  6124.             items=Zotero.selectItems(items);
  6125.             for(var codes in items)    {
  6126.                 var newItem=new Zotero.Item("book");
  6127.                 newItem.itemID=codes;
  6128.                 newItem.title=items[codes];
  6129.                 var itempath=''//dd/p[contains(a[2]/text(), "''+codes+''")]'';
  6130.                 var itempath2=''//dd/p[contains(a/text(), "''+codes+''")]'';
  6131.                 var data;
  6132.                 if(data=doc.evaluate(itempath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  6133.                     data=data.innerHTML;
  6134.                 else if(data=doc.evaluate(itempath2, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())
  6135.                     data=data.innerHTML;
  6136.                 doBook(newItem, data);
  6137.                 newItem.complete();
  6138.             }    
  6139.         }
  6140.         var chappath=''//dt/img[@alt="Chapter"]'';
  6141.         var singpath=''//h3[text()="Table of Contents"]'';
  6142.         if(doc.evaluate(chappath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  6143.             var newItem=new Zotero.Item("bookSection");
  6144.             var titlpath=''//span/h3/text()'';
  6145.             var titles=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6146.             newItem.title=titles.iterateNext().nodeValue;
  6147.             newItem.bookTitle=titles.iterateNext().nodeValue;
  6148.             var datapath=''//dd/p'';
  6149.             var entries=doc.evaluate(datapath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6150.             var chaptext=entries.iterateNext().innerHTML;
  6151.             doChap(newItem, chaptext);
  6152.             var bookdata=entries.iterateNext().innerHTML;
  6153.             doBook(newItem, bookdata);
  6154.             var linkpath=''//td[1][@class="td1"]/a[1]'';
  6155.             var linx=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6156.             var pdflink;
  6157.             while(pdflink=linx.iterateNext())
  6158.                 newItem.attachments.push({url:pdflink.href, title:"RCS PDF", mimeType:"application/pdf"});
  6159.             newItem.complete();
  6160.         }
  6161.         else if(doc.evaluate(singpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  6162.             var newItem=new Zotero.Item("book");
  6163.             var itempath=''//dd/p'';
  6164.             var data=doc.evaluate(itempath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().innerHTML;
  6165.             doBook(newItem, data);
  6166.             var titlpath=''//div/h2/text()'';
  6167.             newItem.title=doc.evaluate(titlpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  6168.             var linkpath=''//td[1][@class="td1"]/a[1]'';
  6169.             var linx=doc.evaluate(linkpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6170.             var pdflink;
  6171.             while(pdflink=linx.iterateNext())
  6172.                 newItem.attachments.push({url:pdflink.href, title:"RCS PDF", mimeType:"application/pdf"});
  6173.             newItem.complete();
  6174.         }
  6175.     }
  6176.     var searchpath=''//div/p[@class="title"][text()="Search Results"]'';
  6177.     if(doc.evaluate(searchpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  6178.         var doipath=''//dd/p/a/text()'';
  6179.         var dois=doc.evaluate(doipath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6180.         var title;
  6181.         var items=new Array();
  6182.         while(title=dois.iterateNext())    {
  6183.             var doi=dois.iterateNext().nodeValue;
  6184.             items[doi.substring(doi.indexOf("1"))]=title.nodeValue;
  6185.         }
  6186.         items=Zotero.selectItems(items);
  6187.         for(var codes in items)    {
  6188.             var itempath=''//dd/p[contains(a/text(), "''+codes+''")]'';
  6189.             var newpath=''//dd[contains(p[2]/a/text(), "''+codes+''")]/p[1]/strong/text()'';
  6190.             var data=doc.evaluate(itempath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().innerHTML;
  6191.             if(data.indexOf("Book:")!=-1)    {
  6192.                 var newItem=new Zotero.Item("bookSection");
  6193.                 newItem.itemID=codes;
  6194.                 newItem.title=items[codes];
  6195.                 doChap(newItem, data);
  6196.                 newItem.complete();
  6197.             }
  6198.             else        {
  6199.                 var newItem=new Zotero.Item("book");
  6200.                 var newdata=doc.evaluate(newpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  6201.                 if(newdata.indexOf("Volume")!=-1)
  6202.                     newItem.volume=newdata.substring(newdata.lastIndexOf(" ")+1);
  6203.                 else
  6204.                     newItem.series=newdata;
  6205.                 newItem.itemID=codes;
  6206.                 newItem.title=items[codes];
  6207.                 doBook(newItem, data);
  6208.                 newItem.complete();
  6209.             }
  6210.         }
  6211.     }
  6212.     Zotero.wait();
  6213. }');
  6214.  
  6215. REPLACE INTO translators VALUES ('4fd6b89b-2316-2dc4-fd87-61a97dd941e8', '1.0.0b3.r1', '', '2007-11-14 17:20:00', '1', '100', '4', 'Library Catalog (InnoPAC)', 'Simon Kornblith', '^https?://[^/]+/(?:search\??/|record=|search%7e/)', 
  6216. 'function detectWeb(doc, url) {
  6217.     // First, check to see if the URL alone reveals InnoPAC, since some sites don''t reveal the MARC button
  6218.     var matchRegexp = new RegExp(''^(https?://[^/]+/search\\??/[^/]+/[^/]+/[0-9]+\%2C[^/]+/)frameset(.+)$'');
  6219.     if(matchRegexp.test(doc.location.href)) {
  6220.         return "book";
  6221.     }
  6222.     // Next, look for the MARC button
  6223.     var namespace = doc.documentElement.namespaceURI;
  6224.     var nsResolver = namespace ? function(prefix) {
  6225.         if (prefix == ''x'') return namespace; else return null;
  6226.     } : null;
  6227.     
  6228.     var xpath = ''//a[img[@src="/screens/marcdisp.gif" or starts-with(@alt, "MARC ") or @src="/screens/regdisp.gif" or @alt="REGULAR RECORD DISPLAY"]]'';
  6229.     var elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  6230.     if(elmt) {
  6231.         return "book";
  6232.     }
  6233.     // Also, check for links to an item display page
  6234.     var tags = doc.getElementsByTagName("a");
  6235.     for(var i=0; i<tags.length; i++) {
  6236.         if(matchRegexp.test(tags[i].href)) {
  6237.             return "multiple";
  6238.         }
  6239.     }
  6240.     
  6241.     return false;
  6242. }', 
  6243. 'function scrape(marc, newDoc) {
  6244.     var namespace = newDoc.documentElement.namespaceURI;
  6245.     var nsResolver = namespace ? function(prefix) {
  6246.       if (prefix == ''x'') return namespace; else return null;
  6247.     } : null;
  6248.     
  6249.     var xpath = ''//pre/text()'';
  6250.     var elmts = newDoc.evaluate(xpath, newDoc, nsResolver,
  6251.                XPathResult.ANY_TYPE, null);
  6252.     var elmt;
  6253.     
  6254.     while(elmt = elmts.iterateNext()) {
  6255.         var text = elmt.nodeValue;
  6256.         
  6257.         var newItem = new Zotero.Item();
  6258.         var record = new marc.record();
  6259.         
  6260.         var linee = text.split("\n");
  6261.         for (var i=0; i<linee.length; i++) {
  6262.             if(!linee[i]) {
  6263.                 continue;
  6264.             }
  6265.             
  6266.             linee[i] = linee[i].replace(/[\xA0_\t]/g, " ");
  6267.             var value = linee[i].substr(7);
  6268.             
  6269.             if(linee[i].substr(0, 6) == "      ") {
  6270.                 // add this onto previous value
  6271.                 tagValue += value;
  6272.             } else {
  6273.                 if(linee[i].substr(0, 6) == "LEADER") {
  6274.                     // trap leader
  6275.                     record.leader = value;
  6276.                 } else {
  6277.                     if(tagValue) {    // finish last tag
  6278.                         tagValue = tagValue.replace(/\|(.)/g, marc.subfieldDelimiter+"$1");
  6279.                         if(tagValue[0] != marc.subfieldDelimiter) {
  6280.                             tagValue = marc.subfieldDelimiter+"a"+tagValue;
  6281.                         }
  6282.                         
  6283.                         // add previous tag
  6284.                         record.addField(tag, ind, tagValue);
  6285.                     }
  6286.                     
  6287.                     var tag = linee[i].substr(0, 3);
  6288.                     var ind  = linee[i].substr(4, 2);
  6289.                     var tagValue = value;
  6290.                 }
  6291.             }
  6292.         }    
  6293.         if(tagValue) {
  6294.             tagValue = tagValue.replace(/\|(.)/g, marc.subfieldDelimiter+"$1");
  6295.             if(tagValue[0] != marc.subfieldDelimiter) {
  6296.                 tagValue = marc.subfieldDelimiter+"a"+tagValue;
  6297.             }
  6298.             
  6299.             // add previous tag
  6300.             record.addField(tag, ind, tagValue);
  6301.         }
  6302.         
  6303.         record.translate(newItem);
  6304.         
  6305.         var domain = newDoc.location.href.match(/https?:\/\/([^/]+)/);
  6306.         newItem.repository = domain[1]+" Library Catalog";
  6307.         
  6308.         newItem.complete();
  6309.     }
  6310. }
  6311.  
  6312. function pageByPage(marc, urls) {
  6313.     Zotero.Utilities.processDocuments(urls, function(newDoc) {
  6314.         scrape(marc, newDoc);
  6315.     }, function() { Zotero.done() });
  6316. }
  6317.  
  6318. function doWeb(doc, url) {
  6319.     var uri = doc.location.href;
  6320.     var newUri;
  6321.     // load translator for MARC
  6322.     var translator = Zotero.loadTranslator("import");
  6323.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  6324.     var marc = translator.getTranslatorObject();
  6325.     
  6326.     var matchRegexp = new RegExp(''^(https?://[^/]+/search\\??/[^/]+/[^/]+/[0-9]+\%2C[^/]+/)frameset(.+)$'');
  6327.     var m = matchRegexp.exec(uri);
  6328.     if(m) {
  6329.         newUri = m[1]+''marc''+m[2];
  6330.     } else {
  6331.         var namespace = doc.documentElement.namespaceURI;
  6332.         var nsResolver = namespace ? function(prefix) {
  6333.             if (prefix == ''x'') return namespace; else return null;
  6334.         } : null;
  6335.     
  6336.         var xpath = ''//a[img[@src="/screens/marcdisp.gif" or starts-with(@alt, "MARC ")]]'';
  6337.         var aTag = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  6338.         if(aTag) {
  6339.             newUri = aTag.href;
  6340.         } else {
  6341.             var xpath = ''//a[img[@src="/screens/regdisp.gif" or @alt="REGULAR RECORD DISPLAY"]]'';
  6342.             var aTag = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  6343.             if(aTag) {
  6344.                 scrape(marc.getTranslatorObject(), doc);
  6345.                 return;
  6346.             }
  6347.         }
  6348.     }
  6349.     
  6350.     if(newUri) {    // single page
  6351.         pageByPage(marc, [newUri]);
  6352.     } else {    // Search results page
  6353.         // Require link to match this
  6354.         var tagRegexp = new RegExp();
  6355.         tagRegexp.compile(''^https?://[^/]+/search\\??/[^/]+/[^/]+/[0-9]+\%2C[^/]+/frameset'');
  6356.         
  6357.         var urls = new Array();
  6358.         var availableItems = new Array();
  6359.         var firstURL = false;
  6360.         
  6361.         var tableRows = doc.evaluate(''//table[@class="browseScreen"]//tr[@class="browseEntry" or @class="briefCitRow" or td/input[@type="checkbox"] or td[contains(@class,"briefCitRow")]]'',
  6362.                                      doc, nsResolver, XPathResult.ANY_TYPE, null);
  6363.         // Go through table rows
  6364.         var i = 0;
  6365.         while(tableRow = tableRows.iterateNext()) {
  6366.             // get link
  6367.             var links = doc.evaluate(''.//span[@class="briefcitTitle"]/a'', tableRow,
  6368.                                      nsResolver, XPathResult.ANY_TYPE, null);
  6369.             var link = links.iterateNext();
  6370.             if(!link) {
  6371.                 var links = doc.evaluate(".//a", tableRow, nsResolver, 
  6372.                                          XPathResult.ANY_TYPE, null);
  6373.                 link = links.iterateNext();
  6374.             }
  6375.             
  6376.             if(link) {
  6377.                 if(availableItems[link.href]) {
  6378.                     continue;
  6379.                 }
  6380.                     
  6381.                 
  6382.                 // Go through links
  6383.                 while(link) {
  6384.                     if(tagRegexp.test(link.href)) {
  6385.                         if(!firstURL) firstURL = link.href;
  6386.                         
  6387.                         var text = link.textContent;
  6388.                         if(text) {
  6389.                             text = Zotero.Utilities.cleanString(text);
  6390.                             if(availableItems[link.href]) {
  6391.                                 availableItems[link.href] += " "+text;
  6392.                             } else {
  6393.                                 availableItems[link.href] = text;
  6394.                             }
  6395.                         }
  6396.                     }
  6397.                     link = links.iterateNext();
  6398.                 }
  6399.                 i++;
  6400.             }
  6401.         };
  6402.         
  6403.         var items = Zotero.selectItems(availableItems);
  6404.         
  6405.         if(!items) {
  6406.             return true;
  6407.         }
  6408.         
  6409.         var newUrls = new Array();
  6410.         for(var url in items) {
  6411.             var m = matchRegexp.exec(url);
  6412.             if(!m) {
  6413.                 throw("matchRegexp choked on "+url);
  6414.             }
  6415.             newUrls.push(m[1]+"marc"+m[2]);
  6416.         }
  6417.         
  6418.         pageByPage(marc, newUrls);
  6419.     }
  6420.  
  6421.     Zotero.wait();
  6422. }');
  6423.  
  6424. REPLACE INTO translators VALUES ('add7c71c-21f3-ee14-d188-caf9da12728b', '1.0.0b3.r1', '', '2007-06-12 23:00:00', '1', '100', '4', 'Library Catalog (SIRSI)', 'Sean Takats', '/uhtbin/cgisirsi', 
  6425. 'function detectWeb(doc, url) {
  6426.     var namespace = doc.documentElement.namespaceURI;
  6427.     var nsResolver = namespace ? function(prefix) {
  6428.         if (prefix == ''x'') return namespace; else return null;
  6429.     } : null;
  6430.     
  6431.     
  6432.     var xpath = ''//tr[th[@class="viewmarctags"]][td[@class="viewmarctags"]]'';
  6433.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  6434.         Zotero.debug("SIRSI detectWeb: viewmarctags");
  6435.         return "book";
  6436.     }
  6437.     var xpath = ''//input[@name="VOPTIONS"]'';
  6438.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  6439.         Zotero.debug("SIRSI detectWeb: VOPTIONS");
  6440.         return "book";
  6441.     }
  6442.     var elmts = doc.evaluate(''/html/body/form//text()'', doc, nsResolver,
  6443.                              XPathResult.ANY_TYPE, null);
  6444.     while(elmt = elmts.iterateNext()) {
  6445.         if(Zotero.Utilities.superCleanString(elmt.nodeValue) == "Viewing record") {
  6446.             Zotero.debug("SIRSI detectWeb: Viewing record");
  6447.             return "book";
  6448.         }
  6449.     }
  6450.     
  6451.     var xpath = ''//td[@class="searchsum"]/table'';
  6452.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  6453.         Zotero.debug("SIRSI detectWeb: searchsum");
  6454.         return "multiple";
  6455.     }
  6456.     var xpath = ''//form[@name="hitlist"]/table/tbody/tr'';
  6457.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  6458.         Zotero.debug("SIRSI detectWeb: hitlist");
  6459.         return "multiple";
  6460.     }
  6461.     //    var xpath = ''//input[@type="checkbox"]''     
  6462. }', 
  6463. 'function scrape(doc) {
  6464.     var namespace = doc.documentElement.namespaceURI;
  6465.     var nsResolver = namespace ? function(prefix) {
  6466.         if (prefix == ''x'') return namespace; else return null;
  6467.     } : null;
  6468.     
  6469.     var xpath = ''//tr[th[@class="viewmarctags"]][td[@class="viewmarctags"]]'';
  6470.     var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6471.     var elmt = elmts.iterateNext();
  6472.     if(!elmt) {
  6473.         return false;
  6474.     }
  6475.  
  6476.     var newItem = new Zotero.Item("book");
  6477.     newItem.extra = "";
  6478.     
  6479.     while(elmt) {
  6480.         try {
  6481.             var node = doc.evaluate(''./TD[1]/A[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  6482.             if(!node) {
  6483.                 var node = doc.evaluate(''./TD[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  6484.             }
  6485.             
  6486.             if(node) {
  6487.                 var casedField = Zotero.Utilities.superCleanString(doc.evaluate(''./TH[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
  6488.                 field = casedField.toLowerCase();
  6489.                 var value = Zotero.Utilities.superCleanString(node.nodeValue);
  6490.                 if(field == "publisher") {
  6491.                     newItem.publisher = value;
  6492.                 } else if(field == "pub date") {
  6493.                     var re = /[0-9]+/;
  6494.                     var m = re.exec(value);
  6495.                     newItem.date = m[0];
  6496.                 } else if(field == "isbn") {
  6497.                     var re = /^[0-9](?:[0-9X]+)/;
  6498.                     var m = re.exec(value);
  6499.                     newItem.ISBN = m[0];
  6500.                 } else if(field == "title") {
  6501.                     var titleParts = value.split(" / ");
  6502.                     newItem.title = Zotero.Utilities.capitalizeTitle(titleParts[0]);
  6503.                 } else if(field == "publication info") {
  6504.                     var pubParts = value.split(" : ");
  6505.                     newItem.place = pubParts[0];
  6506.                 } else if(field == "personal author") {
  6507.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "author", true));
  6508.                 } else if(field == "author"){                 
  6509.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "author", true));
  6510.                 } else if(field == "added author") {
  6511.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(value, "contributor", true));
  6512.                 } else if(field == "corporate author") {
  6513.                     newItem.creators.push({lastName:author, fieldMode:true});
  6514.                 } else if(field == "subject term" || field == "corporate subject" || field == "geographic term") {
  6515.                     var subjects = value.split("--");
  6516.                     newItem.tags = newItem.tags.concat(subjects);
  6517.                 } else if(field == "personal subject") {
  6518.                     var subjects = value.split(", ");
  6519.                     newItem.tags = newItem.tags.push(value[0]+", "+value[1]);
  6520.                 } else if(value && field != "http") {
  6521.                     newItem.extra += casedField+": "+value+"\n";
  6522.                 }
  6523.             }
  6524.         } catch (e) {}
  6525.         
  6526.         elmt = elmts.iterateNext();
  6527.     }
  6528.     
  6529.     if(newItem.extra) {
  6530.         newItem.extra = newItem.extra.substr(0, newItem.extra.length-1);
  6531.     }
  6532.     
  6533.     var callNumber = doc.evaluate(''//tr/td[1][@class="holdingslist"]/text()'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  6534.     if(callNumber && callNumber.nodeValue) {
  6535.         newItem.callNumber = callNumber.nodeValue;
  6536.     }
  6537.     
  6538.     var domain = doc.location.href.match(/https?:\/\/([^/]+)/);
  6539.     newItem.repository = domain[1]+" Library Catalog";
  6540.     
  6541.     newItem.complete();
  6542.     return true;
  6543. }
  6544.  
  6545. function doWeb(doc, url){
  6546.     var namespace = doc.documentElement.namespaceURI;
  6547.     var nsResolver = namespace ? function(prefix) {
  6548.         if (prefix == ''x'') return namespace; else return null;
  6549.     } : null;
  6550.     
  6551.     var sirsiNew = true; //toggle between SIRSI -2003 and SIRSI 2003+
  6552.     var xpath = ''//td[@class="searchsum"]/table'';
  6553.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  6554.         Zotero.debug("SIRSI doWeb: searchsum");
  6555.         sirsiNew = true;    
  6556.     } else if (doc.evaluate(''//form[@name="hitlist"]/table/tbody/tr'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  6557.         Zotero.debug("SIRSI doWeb: hitlist");
  6558.         sirsiNew = false;
  6559.     } else if (doc.evaluate(''//tr[th[@class="viewmarctags"]][td[@class="viewmarctags"]]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  6560.         Zotero.debug("SIRSI doWeb: viewmarctags");
  6561.         sirsiNew = true;
  6562.     } else if (doc.evaluate(''//input[@name="VOPTIONS"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  6563.         Zotero.debug("SIRSI doWeb: VOPTIONS");
  6564.         sirsiNew = false;
  6565.     } else {
  6566.     var elmts = doc.evaluate(''/html/body/form//text()'', doc, nsResolver,
  6567.                              XPathResult.ANY_TYPE, null);
  6568.         while(elmt = elmts.iterateNext()) {
  6569.             if(Zotero.Utilities.superCleanString(elmt.nodeValue) == "Viewing record") {
  6570.                 Zotero.debug("SIRSI doWeb: Viewing record");
  6571.                 sirsiNew = false;
  6572.             }
  6573.         }
  6574.     }
  6575.     
  6576.     if (sirsiNew) { //executes Simon''s SIRSI 2003+ scraper code
  6577.         Zotero.debug("Running SIRSI 2003+ code");
  6578.         if(!scrape(doc)) {
  6579.             
  6580.             var checkboxes = new Array();
  6581.             var urls = new Array();
  6582.             var availableItems = new Array();            
  6583.             //begin IUCAT fixes by Andrew Smith
  6584.             var iuRe = /^https?:\/\/www\.iucat\.iu\.edu/;
  6585.             var iu = iuRe.exec(url);
  6586.             //IUCAT fix 1 of 2
  6587.             if (iu){
  6588.                 var tableRows = doc.evaluate(''//td[@class="searchsum"]/table[//input[@class="submitLink"]]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6589.             } else{
  6590.                 var tableRows = doc.evaluate(''//td[@class="searchsum"]/table[//input[@value="Details"]]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  6591.             }
  6592.             var tableRow = tableRows.iterateNext();        // skip first row
  6593.             // Go through table rows
  6594.             while(tableRow = tableRows.iterateNext()) {
  6595.                 //IUCAT fix 2 of 2
  6596.                 if (iu){
  6597.                     var input = doc.evaluate(''.//input[@class="submitLink"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  6598.                     var text = doc.evaluate(''.//label/span'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  6599.                 } else {
  6600.                     var input = doc.evaluate(''.//input[@value="Details"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();                    
  6601.                     var text = doc.evaluate(''.//label/strong'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;                    
  6602.                 }
  6603.             //end IUCAT fixes by Andrew Smith
  6604.                 if(text) {
  6605.                     availableItems[input.name] = text;
  6606.                 }
  6607.             }        
  6608.             var items = Zotero.selectItems(availableItems);        
  6609.             if(!items) {
  6610.                 return true;
  6611.             }
  6612.             var hostRe = new RegExp("^http(?:s)?://[^/]+");
  6613.             var m = hostRe.exec(doc.location.href);
  6614.             Zotero.debug("href: " + doc.location.href);
  6615.             var hitlist = doc.forms.namedItem("hitlist");
  6616.             var baseUrl = m[0]+hitlist.getAttribute("action")+"?first_hit="+hitlist.elements.namedItem("first_hit").value+"&last_hit="+hitlist.elements.namedItem("last_hit").value;
  6617.             var uris = new Array();
  6618.             for(var i in items) {
  6619.                 uris.push(baseUrl+"&"+i+"=Details");
  6620.             }
  6621.             Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) },
  6622.                 function() { Zotero.done() }, null);
  6623.             Zotero.wait();
  6624.         }    
  6625.     } else{  //executes Simon''s SIRSI -2003 translator code
  6626.         Zotero.debug("Running SIRSI -2003 code");
  6627.         var uri = doc.location.href;
  6628.         var recNumbers = new Array();
  6629.         var xpath = ''//form[@name="hitlist"]/table/tbody/tr'';
  6630.         var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6631.         var elmt = elmts.iterateNext();
  6632.         if(elmt) {    // Search results page
  6633.             var uriRegexp = /^http:\/\/[^\/]+/;
  6634.             var m = uriRegexp.exec(uri);
  6635.             var postAction = doc.forms.namedItem("hitlist").getAttribute("action");
  6636.             var newUri = m[0]+postAction.substr(0, postAction.length-1)+"40";
  6637.             var titleRe = /<br>\s*(.*[^\s])\s*<br>/i;
  6638.             var items = new Array();
  6639.             do {
  6640.                 var checkbox = doc.evaluate(''.//input[@type="checkbox"]'', elmt, nsResolver,
  6641.                                             XPathResult.ANY_TYPE, null).iterateNext();
  6642.                 // Collect title
  6643.                 var title = doc.evaluate("./td[2]", elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  6644.                 if(checkbox && title) {
  6645.                     items[checkbox.name] = Zotero.Utilities.cleanString(title);
  6646.                 }
  6647.             } while(elmt = elmts.iterateNext());
  6648.             items = Zotero.selectItems(items);
  6649.             
  6650.             if(!items) {
  6651.                 return true;
  6652.             }
  6653.             
  6654.             for(var i in items) {
  6655.                 recNumbers.push(i);
  6656.             }
  6657.         } else {        // Normal page
  6658.             // this regex will fail about 1/100,000,000 tries
  6659.             var uriRegexp = /^((.*?)\/([0-9]+?))\//;
  6660.             var m = uriRegexp.exec(uri);
  6661.             var newUri = m[1]+"/40"
  6662.             
  6663.             var elmts = doc.evaluate(''/html/body/form'', doc, nsResolver,
  6664.                                      XPathResult.ANY_TYPE, null);
  6665.             while(elmt = elmts.iterateNext()) {
  6666.                 var initialText = doc.evaluate(''.//text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  6667.                 if(initialText && initialText.nodeValue && Zotero.Utilities.superCleanString(initialText.nodeValue) == "Viewing record") {
  6668.                     recNumbers.push(doc.evaluate(''./b[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
  6669.                     break;
  6670.                 }
  6671.             }    
  6672.             // begin Emory compatibility
  6673.             var elmts = doc.evaluate(''//input[@name="first_hit"]'', doc, nsResolver,
  6674.                                      XPathResult.ANY_TYPE, null);
  6675.             while (elmt = elmts.iterateNext()) {
  6676.                 recNumbers.length = 0;
  6677.                 var recNumber = elmt.value;
  6678.                 recNumbers.push(recNumber);
  6679.                 break;
  6680.              }
  6681.             // end Emory compatibility    
  6682.         }
  6683.         var translator = Zotero.loadTranslator("import");
  6684.         translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  6685.         var marc = translator.getTranslatorObject();
  6686.         Zotero.Utilities.loadDocument(newUri+''?marks=''+recNumbers.join(",")+''&shadow=NO&format=FLAT+ASCII&sort=TITLE&vopt_elst=ALL&library=ALL&display_rule=ASCENDING&duedate_code=l&holdcount_code=t&DOWNLOAD_x=22&DOWNLOAD_y=12&address=&form_type='', function(doc) {
  6687.             var pre = doc.getElementsByTagName("pre");
  6688.             var text = pre[0].textContent;
  6689.             var documents = text.split("*** DOCUMENT BOUNDARY ***");
  6690.             for(var j=1; j<documents.length; j++) {
  6691.                 var uri = newUri+"?marks="+recNumbers[j]+"&shadow=NO&format=FLAT+ASCII&sort=TITLE&vopt_elst=ALL&library=ALL&display_rule=ASCENDING&duedate_code=l&holdcount_code=t&DOWNLOAD_x=22&DOWNLOAD_y=12&address=&form_type=";
  6692.                 var lines = documents[j].split("\n");
  6693.                 var record = new marc.record();
  6694.                 var tag, content;
  6695.                 var ind = "";
  6696.                 for(var i=0; i<lines.length; i++) {
  6697.                     var line = lines[i];
  6698.                     if(line[0] == "." && line.substr(4,2) == ". ") {
  6699.                         if(tag) {
  6700.                             content = content.replace(/\|([a-z])/g, marc.subfieldDelimiter+"$1");
  6701.                             record.addField(tag, ind, content);
  6702.                         }
  6703.                     } else {
  6704.                         content += " "+line.substr(6);
  6705.                         continue;
  6706.                     }
  6707.                     tag = line.substr(1, 3);    
  6708.                     if(tag[0] != "0" || tag[1] != "0") {
  6709.                         ind = line.substr(6, 2);
  6710.                         content = line.substr(8);
  6711.                     } else {
  6712.                         content = line.substr(7);
  6713.                         if(tag == "000") {
  6714.                             tag = undefined;
  6715.                             record.leader = "00000"+content;
  6716.                             Zotero.debug("the leader is: "+record.leader);
  6717.                         }
  6718.                     }
  6719.                 }    
  6720.                 var newItem = new Zotero.Item();
  6721.                 record.translate(newItem);
  6722.                 
  6723.                 var domain = url.match(/https?:\/\/([^/]+)/);
  6724.                 newItem.repository = domain[1]+" Library Catalog";
  6725.  
  6726.                 newItem.complete();
  6727.             }
  6728.             Zotero.done();
  6729.         });
  6730.         Zotero.wait();    
  6731.     }
  6732. }');
  6733.  
  6734. REPLACE INTO translators VALUES ('a77690cf-c5d1-8fc4-110f-d1fc765dcf88', '1.0.0b3.r1', '', '2007-12-03 03:00:00', '1', '100', '4', 'ProQuest', 'Simon Kornblith', '^https?://[^/]+/pqdweb\?((?:.*\&)?did=.*&Fmt=[0-9]|(?:.*\&)Fmt=[0-9].*&did=|(?:.*\&)searchInterface=|(?:.*\&)TS=[0-9])', 
  6735. 'function detectWeb(doc, url) {
  6736.     var namespace = doc.documentElement.namespaceURI;
  6737.     var nsResolver = namespace ? function(prefix) {
  6738.         if (prefix == ''x'') return namespace; else return null;
  6739.     } : null;
  6740.            
  6741.     if(doc.evaluate(''//img[substring(@src, string-length(@src)-32) = "/images/common/logo_proquest.gif" or substring(@src, string-length(@src)-38) = "/images/common/logo_proquest_small.gif"]'',
  6742.                     doc, nsResolver, XPathResult.ANY_TYPE, null)) {    
  6743.                         
  6744.         
  6745.         var xpath = ''//table[@id="tableIndexTerms"]/tbody/tr/td[@class="textSmall"]'';
  6746.         var data= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6747.         var aitem;
  6748.         var source;
  6749.         while(aitem = data.iterateNext()) {
  6750.             source=aitem.textContent;
  6751.             if(source=="Source type:") {
  6752.                 source=data.iterateNext().textContent;
  6753.                 Zotero.debug("Item Source Type: "+source);
  6754.                 break;
  6755.             }
  6756.         }        
  6757.                     
  6758.         if(doc.title == "Results") {
  6759.             return "multiple";
  6760.         } else if(doc.title == "Document View") {
  6761.             switch (source) {
  6762.                 case ''Dissertation'':
  6763.                     return "thesis";
  6764.                     break;
  6765.                 case ''Historical Newspaper'':
  6766.                 case ''Newspaper'':
  6767.                     return "newspaperArticle";
  6768.                 default:
  6769.                     return "journalArticle";
  6770.                     break;
  6771.             }
  6772.             
  6773.         }
  6774.     }
  6775. }
  6776.  
  6777. //^https?://[^/]+/pqdweb\?((?:.*\&)?did=.*&Fmt=[0-9]|(?:.*\&)Fmt=[0-9].*&did=|(?:.*\&)searchInterface=)', 
  6778. 'function parseRIS(uris) {
  6779.     
  6780.     Zotero.Utilities.HTTP.doGet(uris, function(text, xmlhttp, url){    
  6781.         // load translator for RIS
  6782.  
  6783.         if(url.match("exportFormat=1")=="exportFormat=1") {
  6784.             var translator = Zotero.loadTranslator("import");
  6785.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  6786.             // Strip lines with just whitespace, which mess up RIS parsing
  6787.             text = text.replace(/^\s*$\n/gm, '''');
  6788.             translator.setString(text);
  6789.  
  6790.             //Set Handler fixes anomaly in Proquest RIS format. Properly formats author name as [last name], [first name]
  6791.             translator.setHandler("itemDone", function(obj, item) {
  6792.                 var cre = new Array();
  6793.                 cre = item.creators;
  6794.                 for each(var e in cre) {
  6795.     
  6796.                     if(!e[''firstName'']) {
  6797.                         //check if there is a first name, if not, take the first word in the last name
  6798.                         var names = e[''lastName''].split(" ");
  6799.                         e[''firstName'']=names[0];
  6800.                         e[''lastName'']="";
  6801.                         for(var i = 1; i<names.length; i++) {
  6802.                             e[''lastName'']+=names[i];
  6803.                         }
  6804.                     }
  6805.                 }
  6806.  
  6807.                 item.complete();
  6808.             });
  6809.         
  6810.             translator.translate();
  6811.             Zotero.done();
  6812.         }
  6813.         
  6814.     }, function() {});
  6815.     Zotero.wait();
  6816. }
  6817.  
  6818. function doWeb(doc, url) {
  6819.     var namespace = doc.documentElement.namespaceURI;
  6820.     var nsResolver = namespace ? function(prefix) {
  6821.         if (prefix == ''x'') return namespace; else return null;
  6822.     } : null;
  6823.     
  6824.     var hostRegexp = new RegExp("^(https?://[^/]+)/");
  6825.     var hMatch = hostRegexp.exec(url);
  6826.     var host = hMatch[1];
  6827.     
  6828.  
  6829.     
  6830.     if(doc.evaluate(''//img[substring(@src, string-length(@src)-32) = "/images/common/logo_proquest.gif" or substring(@src, string-length(@src)-38) = "/images/common/logo_proquest_small.gif"]'',
  6831.                         doc, nsResolver, XPathResult.ANY_TYPE, null)) {
  6832.             if(doc.title == "Results") {
  6833.                 
  6834.                 //Get Client ID
  6835.                 var xpath = ''//a'';
  6836.                 var data= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6837.                 var aitem;
  6838.                 var clientID;
  6839.                 while(aitem = data.iterateNext()) {
  6840.                     clientID=aitem.href;
  6841.                     if(clientID.indexOf("clientId")!=-1) {
  6842.                         clientID = clientID.substr(clientID.indexOf("clientId")+9,clientID.length);
  6843.                         break;
  6844.                     }
  6845.                 }        
  6846.                 
  6847.                 var multXpath = ''//input[@name="chk"][@type="checkbox"]'';
  6848.                 var titleXpath = ''//a[@class="bold"]'';
  6849.                 var mInfos = doc.evaluate(multXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6850.                 var titleElmts = doc.evaluate(titleXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6851.                 var titleElmt;
  6852.                 var mInfo;
  6853.                 mInfo = mInfos.iterateNext();
  6854.                 titleElmt = titleElmts.iterateNext();
  6855.  
  6856.                 var items = new Array();
  6857.  
  6858.                 do {
  6859.                     //Get item ID
  6860.                     
  6861.                     var str= mInfo.value;
  6862.                     str= str.replace("retrieveGroup", "sid");
  6863.                     var url = host+"/pqdweb?RQT=530&markedListInfo="+str+"1";
  6864.                     items[url] = Zotero.Utilities.trimInternal(titleElmt.textContent);
  6865.  
  6866.                 } while((mInfo = mInfos.iterateNext()) && (titleElmt = titleElmts.iterateNext()));
  6867.  
  6868.                 items = Zotero.selectItems(items);
  6869.                 if(!items) return true;
  6870.  
  6871.                 
  6872.                 //Array of URLs for the doGet
  6873.                 var uris = new Array();
  6874.                 
  6875.                 //Clear Basket
  6876.                 uris.push(host+"/pqdweb?RQT=531&clientId="+clientID);
  6877.                 uris.push(host+"/pqdweb?RQT=532&clientId="+clientID);
  6878.                 
  6879.                 //Add URLS to the basket
  6880.                 for(var bibcode in items) {
  6881.                     uris.push(bibcode);
  6882.                 }
  6883.                     
  6884.                 //Export basket as a RIS file
  6885.                 uris.push(host+"/pqdweb?RQT=532&clientId="+clientID);
  6886.                 uris.push(host+"/pqdweb?RQT=562&MRR=M&clientId="+clientID);
  6887.                 uris.push(host+"/pqdweb?RQT=562&exportFormat=1&clientId="+clientID);
  6888.                 
  6889.                 parseRIS(uris);
  6890.                 
  6891.             } else {
  6892.  
  6893.                 //Get Client ID
  6894.                 var xpath = ''//a'';
  6895.                 var data= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  6896.                 var aitem;
  6897.                 var clientID;
  6898.                 while(aitem = data.iterateNext()) {
  6899.                     clientID=aitem.href;
  6900.                     if(clientID.indexOf("clientId")!=-1) {
  6901.                         clientID = clientID.substr(clientID.indexOf("clientId")+9,clientID.length);
  6902.                         break;
  6903.                     }
  6904.                 }        
  6905.                 
  6906.                 //Get item ID
  6907.                 var xpath = ''//input[@name="marked"][@type="checkbox"]'';
  6908.                 var str= doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  6909.                 str= str.replace("retrieveGroup", "sid");
  6910.                 
  6911.                 //Array of URLs for the doGet
  6912.                 var uris = new Array();
  6913.                 
  6914.                 //Clear Basket
  6915.                 uris.push(host+"/pqdweb?RQT=531&clientId="+clientID);
  6916.                 uris.push(host+"/pqdweb?RQT=532&clientId="+clientID);
  6917.                 
  6918.                 //Create URL to add item to basket
  6919.                 url = host+"/pqdweb?RQT=530&markedListInfo="+str+"1";
  6920.                 Zotero.debug("RIS URL: "+url);
  6921.                 
  6922.                 uris.push(url);
  6923.                     
  6924.                 //Export basket as a RIS file
  6925.                 uris.push(host+"/pqdweb?RQT=532&clientId="+clientID);
  6926.                 uris.push(host+"/pqdweb?RQT=562&MRR=M&clientId="+clientID);
  6927.                 uris.push(host+"/pqdweb?RQT=562&exportFormat=1&clientId="+clientID);
  6928.                 
  6929.                 parseRIS(uris);
  6930.                 
  6931.             }
  6932.         }
  6933.  
  6934. }');
  6935.  
  6936. REPLACE INTO translators VALUES ('6773a9af-5375-3224-d148-d32793884dec', '1.0.0b3.r1', '', '2006-12-18 06:00:45', '1', '100', '4', 'InfoTrac', 'Simon Kornblith', '^https?://[^/]+/itw/infomark/', 
  6937. 'function detectWeb(doc, url) {
  6938.     var namespace = doc.documentElement.namespaceURI;
  6939.     var nsResolver = namespace ? function(prefix) {
  6940.         if (prefix == ''x'') return namespace; else return null;
  6941.     } : null;
  6942.     
  6943.     // ensure that there is an InfoTrac logo
  6944.     if(!doc.evaluate(''//img[substring(@alt, 1, 8) = "InfoTrac"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) return false;
  6945.     
  6946.     if(doc.title.substring(0, 8) == "Article ") {
  6947.         var genre = doc.evaluate(''//comment()[substring(., 1, 6) = " Genre"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  6948.         
  6949.         if(genre) {
  6950.             var value = Zotero.Utilities.cleanString(genre.nodeValue.substr(7));
  6951.             if(value == "article") {
  6952.                 return "journalArticle";
  6953.             } else if(value == "book") {
  6954.                 return "book";
  6955.             } else if(value == "dissertation") {
  6956.                 return "thesis";
  6957.             } else if(value == "bookitem") {
  6958.                 return "bookSection";
  6959.             }
  6960.         }
  6961.         
  6962.         return "magazineArticle";
  6963.     } else if(doc.title.substring(0, 10) == "Citations ") {
  6964.         return "multiple";
  6965.     }
  6966. }', 
  6967. 'function extractCitation(url, elmts, title, doc) {
  6968.     var newItem = new Zotero.Item();
  6969.     newItem.url = url;
  6970.     
  6971.     if(title) {
  6972.         newItem.title = Zotero.Utilities.superCleanString(title);
  6973.     }
  6974.     while(elmt = elmts.iterateNext()) {
  6975.         var colon = elmt.nodeValue.indexOf(":");
  6976.         var field = elmt.nodeValue.substring(1, colon).toLowerCase();
  6977.         var value = elmt.nodeValue.substring(colon+1, elmt.nodeValue.length-1);
  6978.         if(field == "title") {
  6979.             newItem.title = Zotero.Utilities.superCleanString(value);
  6980.         } else if(field == "journal") {
  6981.             newItem.publicationTitle = value;
  6982.         } else if(field == "pi") {
  6983.             parts = value.split(" ");
  6984.             var date = "";
  6985.             var field = null;
  6986.             for(j in parts) {
  6987.                 firstChar = parts[j].substring(0, 1);
  6988.                 
  6989.                 if(firstChar == "v") {
  6990.                     newItem.itemType = "journalArticle";
  6991.                     field = "volume";
  6992.                 } else if(firstChar == "i") {
  6993.                     field = "issue";
  6994.                 } else if(firstChar == "p") {
  6995.                     field = "pages";
  6996.                     
  6997.                     var pagesRegexp = /p(\w+)\((\w+)\)/;    // weird looking page range
  6998.                     var match = pagesRegexp.exec(parts[j]);
  6999.                     if(match) {            // yup, it''s weird
  7000.                         var finalPage = parseInt(match[1])+parseInt(match[2])
  7001.                         parts[j] = "p"+match[1]+"-"+finalPage.toString();
  7002.                     } else if(!newItem.itemType) {    // no, it''s normal
  7003.                         // check to see if it''s numeric, bc newspaper pages aren''t
  7004.                         var justPageNumber = parts[j].substr(1);
  7005.                         if(parseInt(justPageNumber).toString() != justPageNumber) {
  7006.                             newItem.itemType = "newspaperArticle";
  7007.                         }
  7008.                     }
  7009.                 } else if(!field) {    // date parts at the beginning, before
  7010.                                     // anything else
  7011.                     date += " "+parts[j];
  7012.                 }
  7013.                 
  7014.                 if(field) {
  7015.                     isDate = false;
  7016.                     
  7017.                     if(parts[j] != "pNA") {        // make sure it''s not an invalid
  7018.                                                 // page number
  7019.                         // chop of letter
  7020.                         newItem[field] = parts[j].substring(1);
  7021.                     } else if(!newItem.itemType) {        // only newspapers are missing
  7022.                                                         // page numbers on infotrac
  7023.                         newItem.itemType = "newspaperArticle";
  7024.                     }
  7025.                 }
  7026.             }
  7027.             
  7028.             // Set type
  7029.             if(!newItem.itemType) {
  7030.                 newItem.itemType = "magazineArticle";
  7031.             }
  7032.             
  7033.             if(date != "") {
  7034.                 newItem.date = date.substring(1);
  7035.             }
  7036.         } else if(field == "author") {
  7037.             var author = Zotero.Utilities.cleanAuthor(value, "author", true);
  7038.             
  7039.             // ensure author is not already there
  7040.             var add = true;
  7041.             for each(var existingAuthor in newItem.creators) {
  7042.                 if(existingAuthor.firstName == author.firstName && existingAuthor.lastName == author.lastName) {
  7043.                     add = false;
  7044.                     break;
  7045.                 }
  7046.             }
  7047.             if(add) newItem.creators.push(author);
  7048.         } else if(field == "issue") {
  7049.             newItem.issue = value;
  7050.         } else if(field == "volume") {
  7051.             newItem.volume = value;
  7052.         } else if(field == "issn") {
  7053.             newItem.ISSN = value;
  7054.         } else if(field == "gjd") {
  7055.             var m = value.match(/\(([0-9]{4}[^\)]*)\)(?:, pp\. ([0-9\-]+))?/);
  7056.             if(m) {
  7057.                 newItem.date = m[1];
  7058.                 newItem.pages = m[2];
  7059.             }
  7060.         } else if(field == "BookTitle") {
  7061.             newItem.publicationTitle = value;
  7062.         } else if(field == "genre") {
  7063.             value = value.toLowerCase();
  7064.             if(value == "article") {
  7065.                 newItem.itemType = "journalArticle";
  7066.             } else if(value == "book") {
  7067.                 newItem.itemType = "book";
  7068.             } else if(value == "dissertation") {
  7069.                 newItem.itemType = "thesis";
  7070.             } else if(value == "bookitem") {
  7071.                 newItem.itemType = "bookSection";
  7072.             }
  7073.         }
  7074.     }
  7075.     
  7076.     if(doc) {
  7077.         newItem.attachments.push({document:doc, title:"InfoTrac Snapshot"});
  7078.     } else {
  7079.         newItem.attachments.push({url:url, title:"InfoTrac Snapshot",
  7080.                                  mimeType:"text/html"});
  7081.     }
  7082.     
  7083.     newItem.complete();
  7084. }
  7085.  
  7086. function doWeb(doc, url) {    
  7087.     var namespace = doc.documentElement.namespaceURI;
  7088.     var nsResolver = namespace ? function(prefix) {
  7089.         if (prefix == ''x'') return namespace; else return null;
  7090.     } : null;
  7091.  
  7092.     var uri = doc.location.href;
  7093.     if(doc.title.substring(0, 8) == "Article ") {    // article
  7094.         var xpath = ''/html/body//comment()'';
  7095.         var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  7096.         extractCitation(uri, elmts);
  7097.     } else {                                        // search results
  7098.         var items = new Array();
  7099.         var uris = new Array();
  7100.         var elmts = new Array();
  7101.         
  7102.         var host = doc.location.href.match(/^https?:\/\/[^\/]+/)[0];
  7103.         
  7104.         var tableRows = doc.evaluate(''/html/body//table/tbody/tr/td[a/b]'', doc, nsResolver,
  7105.                                      XPathResult.ANY_TYPE, null);
  7106.         var tableRow;
  7107.         var javaScriptRe = /''([^'']*)'' *, *''([^'']*)''/
  7108.         var i = 0;
  7109.         // Go through table rows
  7110.         while(tableRow = tableRows.iterateNext()) {
  7111.             var link = doc.evaluate(''./a'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  7112.             var m = javaScriptRe.exec(link.href);
  7113.             if(m) {
  7114.                 uris[i] = host+"/itw/infomark/192/215/90714844w6"+m[1]+"?sw_aep=olr_wad"+m[2];
  7115.             }
  7116.             var article = doc.evaluate(''./b/text()'', link, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  7117.             items[i] = article.nodeValue;
  7118.             // Chop off final period
  7119.             if(items[i].substr(items[i].length-1) == ".") {
  7120.                 items[i] = items[i].substr(0, items[i].length-1);
  7121.             }
  7122.             elmts[i] = doc.evaluate(".//comment()", tableRow, nsResolver, XPathResult.ANY_TYPE, null);
  7123.             i++;
  7124.         }
  7125.         
  7126.         items = Zotero.selectItems(items);
  7127.         
  7128.         if(!items) {
  7129.             return true;
  7130.         }
  7131.         
  7132.         for(var i in items) {
  7133.             extractCitation(uris[i], elmts[i], items[i]);
  7134.         }
  7135.     }
  7136. }');
  7137.  
  7138. REPLACE INTO translators VALUES ('63c25c45-6257-4985-9169-35b785a2995e', '1.0.0b3.r1', '', '2006-12-15 03:40:00', 1, 100, 4, 'InfoTrac OneFile', 'Simon Kornblith', '^https?://[^/]+/itx/(?:[a-z]+Search|retrieve|paginate|tab)\.do',
  7139. 'function detectWeb(doc, url) {
  7140.     var namespace = doc.documentElement.namespaceURI;
  7141.     var nsResolver = namespace ? function(prefix) {
  7142.         if (prefix == ''x'') return namespace; else return null;
  7143.     } : null;
  7144.     
  7145.     if(doc.evaluate(''//img[@alt="Thomson Gale"]'', doc, nsResolver,
  7146.                     XPathResult.ANY_TYPE, null).iterateNext()) {
  7147.         if(doc.evaluate(''//table[@class="resultstable"][tbody/tr[@class="unselectedRow"]]'',
  7148.                         doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7149.             return "multiple";
  7150.         } else {
  7151.             return "journalArticle";
  7152.         }
  7153.     }
  7154. }',
  7155. 'function infoTracRIS(text) {
  7156.     // load translator for RIS
  7157.     var translator = Zotero.loadTranslator("import");
  7158.     translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  7159.     translator.setString(text);
  7160.     translator.setHandler("itemDone", function(obj, item) {
  7161.         if(item.notes && item.notes[0]) {
  7162.             item.extra = item.notes[0].note;
  7163.             
  7164.             delete item.notes;
  7165.             item.notes = undefined;
  7166.         }
  7167.         
  7168.         // get underscored terms (term headings?) out of tags
  7169.         for(var i in item.tags) {
  7170.             var index = item.tags[i].indexOf("_");
  7171.             if(index != -1) {
  7172.                 item.tags[i] = item.tags[i].substr(0, index);
  7173.             }
  7174.         }
  7175.         
  7176.         // add names to attachments
  7177.         for(var i in item.attachments) {
  7178.             if(!item.attachments[i].title) {
  7179.                 item.attachments[i] = undefined;
  7180.             } else {
  7181.                 item.attachments[i].title = "InfoTrac OneFile "+item.attachments[i].title;
  7182.             }
  7183.         }
  7184.         
  7185.         //item.attachments = newAttachments.shift();
  7186.         //Zotero.debug(item.attachments);
  7187.         item.complete();
  7188.     });
  7189.     translator.translate();
  7190.     Zotero.done();
  7191. }
  7192.  
  7193. function readEncoded(url) {
  7194.     var newArray = new Array();
  7195.     
  7196.     var parts = url.split(/[?&]/);
  7197.     for each(var part in parts) {
  7198.         var index = part.indexOf("=");
  7199.         if(index !== -1) {
  7200.             newArray[part.substr(0, index)] = part.substr(index+1);
  7201.         }
  7202.     }
  7203.     
  7204.     return newArray;
  7205. }
  7206.  
  7207. function doWeb(doc, url) {
  7208.     var namespace = doc.documentElement.namespaceURI;
  7209.     var nsResolver = namespace ? function(prefix) {
  7210.         if (prefix == ''x'') return namespace; else return null;
  7211.     } : null;
  7212.     
  7213.     var hostRe = new RegExp("^https?://[^/]+/");
  7214.     var host = hostRe.exec(doc.location.href)[0];
  7215.     
  7216.     if(doc.evaluate(''//table[@class="resultstable"][tbody/tr[@class="unselectedRow"]]'',
  7217.                     doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  7218.         var items = Zotero.Utilities.getItemArray(doc, doc, ''^https?://[^/]+/itx/retrieve\\.do\\?.*docId='');
  7219.         items = Zotero.selectItems(items);
  7220.         
  7221.         if(!items) {
  7222.             return true;
  7223.         }
  7224.  
  7225.         // parse things out of URLs
  7226.         var time = new Date();
  7227.         time = time.getTime();
  7228.         var markedString = "";
  7229.         for(var i in items) {
  7230.             var postVal = readEncoded(i);
  7231.             markedString += postVal.tabID+"_"+postVal.docId+"_1_0_"+postVal.contentSet+"_srcprod="+postVal.prodId+"|^";
  7232.         }
  7233.         
  7234.         var postData = "inPS=true&ts="+time+"&prodId="+postVal.prodId+"&actionCmd=UPDATE_MARK_LIST&userGroupName="+postVal.userGroupName+"&markedString="+markedString+"&a="+time;
  7235.         Zotero.Utilities.HTTP.doGet(host+"itx/marklist.do?inPS=true&ts="+time+"&prodId="+postVal.prodId+"&actionCmd=CLEAR_MARK_LIST&userGroupName="+postVal.userGroupName,
  7236.                                      function(text) {            // clear marked
  7237.             Zotero.Utilities.HTTP.doPost(host+"itx/marklist.do", postData,
  7238.                                           function(text) {        // mark
  7239.                 Zotero.Utilities.HTTP.doGet(host+"itx/generateCitation.do?contentSet="+postVal.contentSet+"&inPS=true&tabID=T-ALL&prodId="+postVal.prodId+"&docId=&actionString=FormatCitation&userGroupName="+postVal.userGroupName+"&citationFormat=ENDNOTE",
  7240.                                              function(text) {    // get marked
  7241.                     infoTracRIS(text);
  7242.                 });
  7243.             });
  7244.         });
  7245.     } else {
  7246.         // just extract from single page
  7247.         var postVal = readEncoded(url);
  7248.         Zotero.Utilities.HTTP.doGet(host+"itx/generateCitation.do?contentSet="+postVal.contentSet+"&inPS=true&tabID="+postVal.tabID+"&prodId="+postVal.prodId+"&docId="+postVal.docId+"&actionString=FormatCitation&citationFormat=ENDNOTE",
  7249.                                      function(text) {
  7250.             infoTracRIS(text);
  7251.         });
  7252.     }
  7253.     
  7254.     Zotero.wait();
  7255. }');
  7256.  
  7257. REPLACE INTO translators VALUES ('b047a13c-fe5c-6604-c997-bef15e502b09', '1.0.0b3.r1', '', '2008-01-29 23:00:00', '1', '100', '4', 'LexisNexis', 'Sean Takats', 'https?://[^/]*lexis-?nexis\.com[^/]*/us/lnacademic', 
  7258. 'function detectWeb(doc, url) {
  7259.     var namespace = doc.documentElement.namespaceURI;
  7260.     var nsResolver = namespace ? function(prefix) {
  7261.         if (prefix == ''x'') return namespace; else return null;
  7262.     } : null;
  7263.     Zotero.debug(doc.title);
  7264.     if (doc.title.substr(doc.title.length-8, 8)=="Document"){
  7265.         var xpath = ''//input[@name="cisb"]'';
  7266.         var elmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  7267.         if (elmt.iterateNext()){
  7268.             return "newspaperArticle";
  7269.         }
  7270.     }
  7271. }', 
  7272. 'function doWeb(doc, url) {
  7273.     var hostRe = new RegExp("^http(?:s)?://[^/]+");
  7274.     var m = hostRe.exec(doc.location.href);
  7275.     var host = m[0];
  7276.  
  7277.     var namespace = doc.documentElement.namespaceURI;
  7278.     var nsResolver = namespace ? function(prefix) {
  7279.         if (prefix == ''x'') return namespace; else return null;
  7280.     } : null;
  7281.     var risb = doc.evaluate(''//input[@name="risb"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  7282.     var cisb = doc.evaluate(''//input[@name="cisb"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  7283.     var uri = host+"/us/lnacademic/results/listview/delPrep.do?cisb="+cisb+"&risb="+risb+"&mode=delivery_refworks";    
  7284.     var hiddenInputs = doc.evaluate(''//form[@name="results_docview_DocumentForm"]//input[@type="hidden"]'', doc, nsResolver,
  7285.         XPathResult.ANY_TYPE, null);
  7286.     var hiddenInput;
  7287.     var poststring="";
  7288.     while(hiddenInput = hiddenInputs.iterateNext()) {
  7289.         poststring = poststring+"&"+hiddenInput.name+"="+encodeURIComponent(hiddenInput.value);
  7290.     }
  7291.     poststring = poststring + "&hiddensearchfield=Narrow+Search&reloadClassif=&format=GNBFI&focusTerms=&nextSteps=0";
  7292.     Zotero.Utilities.HTTP.doPost(uri, poststring, function(text) {
  7293.         uri = host+"/us/lnacademic/delivery/refExport.do";
  7294.         var disb = text.match(/<input type="hidden" name="disb" value="([^"]+)">/);
  7295.         var poststring = "delRange=cur&selDocs=&disb="+disb[1]+"&initializationPage=0";
  7296.         Zotero.Utilities.HTTP.doPost(uri, poststring, function(text) {
  7297.             uri = text.match(/&url=([^'']+)''/)
  7298.             uri = decodeURIComponent(uri[1]);
  7299.             uri = uri.replace(/http:\/\/[^/]*\//, host+"/");
  7300.             var uris = new Array();
  7301.             uris.push(uri);
  7302.             Zotero.Utilities.processDocuments(uris, function(newDoc){
  7303.                 var newItem = new Zotero.Item("newspaperArticle");
  7304.                 var title = newDoc.evaluate(''//div[@class="HEADLINE"]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  7305.                 if (title){
  7306.                     newItem.title = title.textContent;
  7307.                 }else{
  7308.                     newItem.title = " ";
  7309.                 }
  7310.                 var date = newDoc.evaluate(''//meta[@name="_lndateissue"]/@content'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  7311.                 if (date){
  7312.                     date = date.nodeValue;
  7313.                     var m = date.match(/([^T]+)T/);
  7314.                     date = m[1];
  7315.                     Zotero.debug(date);
  7316.                     if (date.length == 8){
  7317.                         date = date.substr(0,4) + "-" + date.substr(4,2) + "-" + date.substr(6,2);
  7318.                     } else if (date.length == 6){
  7319.                         date = date.substr(0,4) + "-" + date.substr(4,2);
  7320.                     }
  7321.                     newItem.date = date;         
  7322.                 }
  7323.                 var publicationTitle = newDoc.evaluate(''//div[@class="PUB"]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  7324.                 if (publicationTitle){
  7325.                     newItem.publicationTitle = publicationTitle.textContent;
  7326.                 }
  7327.                 var section = newDoc.evaluate(''//div[@class="SECTION-INFO"]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  7328.                 if (section){
  7329.                     newItem.section = section.textContent;                
  7330.                 }
  7331.                 var author = newDoc.evaluate(''//div[@class="BYLINE"]'', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  7332.                 if (author){
  7333.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(author.textContent, "author"));
  7334.                 }
  7335.                 newItem.respository = "lexisnexis.com";
  7336.                 newItem.url = url;
  7337.                 newItem.complete();
  7338.                 Zotero.done();
  7339.             });
  7340.         });
  7341.     });
  7342.     Zotero.wait();
  7343. }');
  7344.  
  7345. REPLACE INTO translators VALUES ('5e3e6245-83da-4f55-a39b-b712df54a935', '1.0.0b3.r1', '', '2007-08-27 05:00:00', '0', '90', '4', 'Melvyl', 'Sean Takats', '^https?://(?:melvyl.cdlib.org|melvyl-dev.cdlib.org:8162)/F(?:/[A-Z0-9\-]+(?:\?.*)?$|\?func=find|\?func=scan)', 
  7346. 'function detectWeb(doc, url) {
  7347.     var singleRe = new RegExp("^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=[0-9]{3}|func=direct)");
  7348.     
  7349.     if(singleRe.test(doc.location.href)) {
  7350.         return "book";
  7351.     } else {
  7352.         var tags = doc.getElementsByTagName("a");
  7353.         for(var i=0; i<tags.length; i++) {
  7354.             if(singleRe.test(tags[i].href)) {
  7355.                 return "multiple";
  7356.             }
  7357.         }
  7358.     }
  7359. }', 
  7360. 'function doWeb(doc, url) {
  7361.     var detailRe = new RegExp("^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=[0-9]{3}|func=direct)");
  7362.     var uri = doc.location.href;
  7363.     var newUris = new Array();
  7364.     
  7365.     if(detailRe.test(uri)) {
  7366.     newUris.push(uri.replace(/\&format=[0-9]{3}/, "&format=001"))
  7367.     } else {
  7368.         var itemRegexp = ''^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=999|func=direct)'';
  7369.         
  7370.         var namespace = doc.documentElement.namespaceURI;
  7371.         var nsResolver = namespace ? function(prefix) {
  7372.             if (prefix == ''x'') return namespace; else return null;
  7373.         } : null;
  7374.             
  7375.         var reviewXpath = ''//table/tbody/tr[td[@class="resultsDisplayWhite"]]''
  7376.         
  7377.         var reviewRows = doc.evaluate(reviewXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  7378.         var reviewRow;
  7379.         
  7380.         var items = new Array();
  7381.         
  7382.         if (reviewRow = reviewRows.iterateNext()){
  7383.             var xpath = ''./td[@class="resultsDisplayWhite"][2]/a[1]'';
  7384.             var titleXpath = ''./td[@class="resultsDisplayWhite"][5]'';
  7385.             var elmt;
  7386.             var titleElmt;
  7387.             do {
  7388.                 elmt = doc.evaluate(xpath, reviewRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  7389.                 titleElmt = doc.evaluate(titleXpath, reviewRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  7390.                 items[elmt.href] = Zotero.Utilities.cleanString(titleElmt.textContent);
  7391.             } while (reviewRow = reviewRows.iterateNext());
  7392.  
  7393.         } else {
  7394.             var xpath = ''//td[2][@class="resultsBrief"]/a[1]'';  // gets MELVYL links
  7395.             var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  7396.             var elmt;
  7397.             var titleXpath = ''//tr[td[@class="resultsBrief"][@id="bold"]/b[text()="Title"]]/td[4]''; // gets MELVYL results titles
  7398.             var titleElmts = doc.evaluate(titleXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  7399.             var titleElmt;
  7400.             while ((elmt = elmts.iterateNext()) && (titleElmt = titleElmts.iterateNext())){
  7401.                 items[elmt.href] = Zotero.Utilities.cleanString(titleElmt.textContent);
  7402.             }
  7403.         }
  7404.             
  7405.         items = Zotero.selectItems(items);
  7406.         
  7407.         if(!items) {
  7408.             return true;
  7409.         }
  7410.         
  7411.         for(var i in items) {
  7412.             var newUri = i.replace(/\&format=[0-9]{3}/, "&format=001")
  7413.             if(newUri == i) {
  7414.                 newUri += "&format=001";
  7415.             }
  7416.             newUris.push(newUri);
  7417.         }
  7418.     }
  7419.     
  7420.     var translator = Zotero.loadTranslator("import");
  7421.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  7422.     var marc = translator.getTranslatorObject();
  7423.     Zotero.Utilities.processDocuments(newUris, function(newDoc) {
  7424.         var uri = newDoc.location.href;
  7425.         
  7426.         var namespace = newDoc.documentElement.namespaceURI;
  7427.         var nsResolver = namespace ? function(prefix) {
  7428.           if (prefix == ''x'') return namespace; else return null;
  7429.         } : null;
  7430.         
  7431.         var xpath = ''//tr[td[1][@class="contentSmall"][@id="bold"]/strong]'';
  7432.         var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null);
  7433.         var elmt;
  7434.         
  7435.         var record = new marc.record();
  7436.         while(elmt = elmts.iterateNext()) {
  7437.             var field = Zotero.Utilities.superCleanString(doc.evaluate(''./TD[1]/strong/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
  7438.             var value = doc.evaluate(''./TD[2]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7439.             
  7440.             if(field == "LDR") {
  7441.                 record.leader = value;
  7442.             } else if(field != "FMT") {
  7443.                 
  7444.                 Zotero.debug("field=" + field);
  7445.                 value = value.replace(/\|([a-z]) /g, marc.subfieldDelimiter+"$1");
  7446.                 
  7447.                 var code = field.substring(0, 3);
  7448.                 var ind = "";
  7449.                 if(field.length > 3) {
  7450.                     ind = field[3];
  7451.                     if(field.length > 4) {
  7452.                         ind += field[4];
  7453.                     }
  7454.                 }
  7455.                 
  7456.                 record.addField(code, ind, value);
  7457.             }
  7458.         }
  7459.         
  7460.         var newItem = new Zotero.Item();
  7461.         record.translate(newItem);
  7462.         
  7463.         var domain = url.match(/https?:\/\/([^/]+)/);
  7464.         newItem.repository = domain[1]+" Library Catalog";
  7465.         
  7466.         newItem.complete();
  7467.     }, function() { Zotero.done(); }, null);
  7468.     
  7469.     Zotero.wait();
  7470. }');
  7471.  
  7472. REPLACE INTO translators VALUES ('cf87eca8-041d-b954-795a-2d86348999d5', '1.0.0b3.r1', '', '2006-12-15 15:11:00', 1, 100, 4, 'Library Catalog (Aleph)', 'Simon Kornblith', '^https?://[^/]+/F(?:/[A-Z0-9\-]+(?:\?.*)?$|\?func=find|\?func=scan)',
  7473. 'function detectWeb(doc, url) {
  7474.     var singleRe = new RegExp("^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=[0-9]{3}|func=direct)");
  7475.     
  7476.     if(singleRe.test(doc.location.href)) {
  7477.         return "book";
  7478.     } else {
  7479.         var tags = doc.getElementsByTagName("a");
  7480.         for(var i=0; i<tags.length; i++) {
  7481.             if(singleRe.test(tags[i].href)) {
  7482.                 return "multiple";
  7483.             }
  7484.         }
  7485.     }
  7486. }',
  7487. 'function doWeb(doc, url) {
  7488.     var detailRe = new RegExp("^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=[0-9]{3}|func=direct)");
  7489.     var uri = doc.location.href;
  7490.     var newUris = new Array();
  7491.     
  7492.     if(detailRe.test(uri)) {
  7493.     newUris.push(uri.replace(/\&format=[0-9]{3}/, "&format=001"))
  7494.     } else {
  7495.         var itemRegexp = ''^https?://[^/]+/F/[A-Z0-9\-]+\?.*(?:func=full-set-set.*\&format=999|func=direct)''
  7496.         var items = Zotero.Utilities.getItemArray(doc, doc, itemRegexp, ''^[0-9]+$'');
  7497.         
  7498.         // ugly hack to see if we have any items
  7499.         var haveItems = false;
  7500.         for(var i in items) {
  7501.             haveItems = true;
  7502.             break;
  7503.         }
  7504.         
  7505.         // If we don''t have any items otherwise, let us use the numbers
  7506.         if(!haveItems) {
  7507.             var items = Zotero.Utilities.getItemArray(doc, doc, itemRegexp);
  7508.         }
  7509.         
  7510.         items = Zotero.selectItems(items);
  7511.         
  7512.         if(!items) {
  7513.             return true;
  7514.         }
  7515.         
  7516.         for(var i in items) {
  7517.             var newUri = i.replace("&format=999", "&format=001");
  7518.             if(newUri == i) {
  7519.                 newUri += "&format=001";
  7520.             }
  7521.             newUris.push(newUri);
  7522.         }
  7523.     }
  7524.     
  7525.     var translator = Zotero.loadTranslator("import");
  7526.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  7527.     var marc = translator.getTranslatorObject();
  7528.     Zotero.Utilities.processDocuments(newUris, function(newDoc) {
  7529.         var uri = newDoc.location.href;
  7530.         
  7531.         var namespace = newDoc.documentElement.namespaceURI;
  7532.         var nsResolver = namespace ? function(prefix) {
  7533.           if (prefix == ''x'') return namespace; else return null;
  7534.         } : null;
  7535.         
  7536.         var xpath = ''//*[tr[td/text()="LDR"]]/tr'';
  7537.         var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null);
  7538.         var elmt;
  7539.         
  7540.         var record = new marc.record();
  7541.         while(elmt = elmts.iterateNext()) {
  7542.             var field = Zotero.Utilities.superCleanString(doc.evaluate(''./TD[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
  7543.             var value = doc.evaluate(''./TD[2]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7544.             
  7545.             if(field == "LDR") {
  7546.                 record.leader = value;
  7547.             } else if(field != "FMT") {
  7548.                 value = value.replace(/\|([a-z]) /g, marc.subfieldDelimiter+"$1");
  7549.                 
  7550.                 var code = field.substring(0, 3);
  7551.                 var ind = "";
  7552.                 if(field.length > 3) {
  7553.                     ind = field[3];
  7554.                     if(field.length > 4) {
  7555.                         ind += field[4];
  7556.                     }
  7557.                 }
  7558.                 
  7559.                 record.addField(code, ind, value);
  7560.             }
  7561.         }
  7562.         
  7563.         var newItem = new Zotero.Item();
  7564.         record.translate(newItem);
  7565.         
  7566.         var domain = url.match(/https?:\/\/([^/]+)/);
  7567.         newItem.repository = domain[1]+" Library Catalog";
  7568.         
  7569.         newItem.complete();
  7570.     }, function() { Zotero.done(); }, null);
  7571.     
  7572.     Zotero.wait();
  7573. }');
  7574.  
  7575. REPLACE INTO translators VALUES ('774d7dc2-3474-2684-392c-f787789ec63d', '1.0.0b3.r1', '', '2007-09-19 20:30:00', '1', '100', '4', 'Library Catalog (Dynix)', 'Simon Kornblith', 'ipac\.jsp\?.*(?:uri=(?:link|full)=[0-9]|menu=search)', 
  7576. 'function detectWeb(doc, url) {
  7577.     var detailsRe = new RegExp(''ipac\.jsp\?.*uri=(?:full|link)=[0-9]'');
  7578.     if(detailsRe.test(doc.location.href)) {
  7579.         return "book";
  7580.     } else {
  7581.         return "multiple";
  7582.     }
  7583. }', 
  7584. 'function doWeb(doc, url) {
  7585.     var namespace = doc.documentElement.namespaceURI;
  7586.     var nsResolver = namespace ? function(prefix) {
  7587.         if (prefix == ''x'') return namespace; else return null;
  7588.     } : null;
  7589.  
  7590.     var uri = doc.location.href;
  7591.     var detailsRe = new RegExp(''ipac\.jsp\?.*uri=(?:full|link)=[0-9]'');
  7592.     
  7593.     var uris = new Array();
  7594.     if(detailsRe.test(uri)) {
  7595.         uris.push(uri+''&fullmarc=true'');
  7596.     } else {
  7597.         var items = Zotero.Utilities.getItemArray(doc, doc, "ipac\.jsp\?.*uri=(?:full|link)=[0-9]|^javascript:buildNewList\\(''.*uri%3Dfull%3D[0-9]");
  7598.         items = Zotero.selectItems(items);
  7599.         
  7600.         if(!items) {
  7601.             return true;
  7602.         }
  7603.         
  7604.         var buildNewList = new RegExp("^javascript:buildNewList\\(''([^'']+)");
  7605.         
  7606.         var uris = new Array();
  7607.         for(var i in items) {
  7608.             var m = buildNewList.exec(i);
  7609.             if(m) {
  7610.                 uris.push(unescape(m[1]+''&fullmarc=true''));
  7611.             } else {
  7612.                 uris.push(i+''&fullmarc=true'');
  7613.             }
  7614.         }
  7615.     }
  7616.     
  7617.     var translator = Zotero.loadTranslator("import");
  7618.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  7619.     var marc = translator.getTranslatorObject();
  7620.     
  7621.     Zotero.Utilities.processDocuments(uris, function(newDoc) {
  7622.         var uri = newDoc.location.href;
  7623.         
  7624.         var namespace = newDoc.documentElement.namespaceURI;
  7625.         var nsResolver = namespace ? function(prefix) {
  7626.           if (prefix == ''x'') return namespace; else return null;
  7627.         } : null;
  7628.         
  7629.         var xpath = ''//form/table[@class="tableBackground"]/tbody/tr/td/table[@class="tableBackground"]/tbody/tr[td[1]/a[@class="normalBlackFont1"]]'';
  7630.         var elmts = newDoc.evaluate(xpath, newDoc, nsResolver, XPathResult.ANY_TYPE, null);
  7631.         if (!elmts.iterateNext()) {
  7632.             var xpath2 = ''//form/table[@class="tableBackground"]/tbody/tr/td/table[@class="tableBackground"]/tbody/tr[td[1]/a[@class="boldBlackFont1"]]'';
  7633.             var elmts = newDoc.evaluate(xpath2, newDoc, nsResolver, XPathResult.ANY_TYPE, null);
  7634.         }
  7635.         var elmt;
  7636.         
  7637.         var record = new marc.record();        
  7638.         while(elmt = elmts.iterateNext()) {
  7639.             var field = Zotero.Utilities.superCleanString(newDoc.evaluate(''./TD[1]/A[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
  7640.             var value = newDoc.evaluate(''./TD[2]/TABLE[1]/TBODY[1]/TR[1]/TD[1]/A[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  7641.             
  7642.             if(field == "LDR") {
  7643.                 record.leader = value;
  7644.             } else if(field != "FMT") {
  7645.                 value = value.replace(/\$([a-z]) /g, marc.subfieldDelimiter+"$1");
  7646.                 
  7647.                 var code = field.substring(0, 3);
  7648.                 var ind = "";
  7649.                 if(field.length > 3) {
  7650.                     ind = field[3];
  7651.                     if(field.length > 4) {
  7652.                         ind += field[4];
  7653.                     }
  7654.                 }
  7655.                 
  7656.                 record.addField(code, ind, value);
  7657.             }
  7658.         }
  7659.         
  7660.         var newItem = new Zotero.Item();
  7661.         record.translate(newItem);
  7662.         
  7663.         var domain = url.match(/https?:\/\/([^/]+)/);
  7664.         newItem.repository = domain[1]+" Library Catalog";
  7665.  
  7666.         newItem.complete();
  7667.     }, function() { Zotero.done() }, null);
  7668.     
  7669.     Zotero.wait();
  7670. }');
  7671.  
  7672. REPLACE INTO translators VALUES ('63a0a351-3131-18f4-21aa-f46b9ac51d87', '1.0.0b3.r1', '', '2006-12-15 15:11:00', 1, 100, 4, 'Library Catalog (VTLS)', 'Simon Kornblith', '/chameleon(?:\?|$)', 
  7673. 'function detectWeb(doc, url) {
  7674.     var node = doc.evaluate(''//tr[@class="intrRow"]/td/table/tbody/tr[th]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext();
  7675.     if(node) {
  7676.         return "multiple";
  7677.     }
  7678.     var node = doc.evaluate(''//a[text()="marc"]'', doc, null, XPathResult.ANY_TYPE, null).iterateNext();
  7679.     if(node) {
  7680.         return "book";
  7681.     }
  7682. }',
  7683. 'function doWeb(doc, url) {
  7684.     var namespace = doc.documentElement.namespaceURI;
  7685.     var nsResolver = namespace ? function(prefix) {
  7686.         if (prefix == ''x'') return namespace; else return null;
  7687.     } : null;
  7688.     
  7689.     var uri = doc.location.href;
  7690.     var newUris = new Array();
  7691.     
  7692.     var marcs = doc.evaluate(''//a[text()="marc"]'', doc, nsResolver,
  7693.                              XPathResult.ANY_TYPE, null);
  7694.     var record = marcs.iterateNext();
  7695.     
  7696.     if(record && !marcs.iterateNext()) {
  7697.         newUris.push(record.href);
  7698.     } else {
  7699.         // Require link to match this
  7700.         var tagRegexp = new RegExp();
  7701.         tagRegexp.compile("/chameleon\?.*function=CARDSCR");
  7702.         
  7703.         var items = new Array();
  7704.         
  7705.         var tableRows = doc.evaluate(''//tr[@class="intrRow"]'', doc, nsResolver,
  7706.                                      XPathResult.ANY_TYPE, null);
  7707.         var tableRow;
  7708.         // Go through table rows
  7709.         while(tableRow = tableRows.iterateNext()) {
  7710.             var links = tableRow.getElementsByTagName("a");
  7711.             // Go through links
  7712.             var url;
  7713.             for(var j=0; j<links.length; j++) {
  7714.                 if(tagRegexp.test(links[j].href)) {
  7715.                     url = links[j].href;
  7716.                     break;
  7717.                 }
  7718.             }
  7719.             if(url) {
  7720.                 // Collect title information
  7721.                 var fields = doc.evaluate(''./td/table/tbody/tr[th]'', tableRow,
  7722.                                           nsResolver, XPathResult.ANY_TYPE, null);
  7723.                 var field;
  7724.                 while(field = fields.iterateNext()) {
  7725.                     var header = doc.evaluate(''./th/text()'', field, nsResolver,
  7726.                                               XPathResult.ANY_TYPE, null).iterateNext();
  7727.                     if(header.nodeValue == "Title") {
  7728.                         var value = doc.evaluate(''./td'', field, nsResolver,
  7729.                             XPathResult.ANY_TYPE, null).iterateNext();
  7730.                         if(value) {
  7731.                             items[url] = Zotero.Utilities.cleanString(value.textContent);
  7732.                         }
  7733.                     }
  7734.                 }
  7735.             }
  7736.         }
  7737.         
  7738.         items = Zotero.selectItems(items);
  7739.         
  7740.         if(!items) {
  7741.             return true;
  7742.         }
  7743.         
  7744.         for(var i in items) {
  7745.             Zotero.debug(i.replace(/function=[A-Z]{7}/, "function=MARCSCR"));
  7746.             newUris.push(i.replace(/function=[A-Z]{7}/, "function=MARCSCR"));
  7747.         }
  7748.     }
  7749.     
  7750.     var translator = Zotero.loadTranslator("import");
  7751.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  7752.     var marc = translator.getTranslatorObject();
  7753.     
  7754.     Zotero.Utilities.processDocuments(newUris, function(newDoc) {
  7755.         var uri = newDoc.location.href
  7756.         
  7757.         var namespace = newDoc.documentElement.namespaceURI;
  7758.         var nsResolver = namespace ? function(prefix) {
  7759.           if (prefix == ''x'') return namespace; else return null;
  7760.         } : null;
  7761.         
  7762.         var record = new marc.record();
  7763.         
  7764.         var xpath = ''//table[@class="outertable"]/tbody/tr[td[4]]'';
  7765.         var elmts = newDoc.evaluate(xpath, newDoc, nsResolver,
  7766.                                     XPathResult.ANY_TYPE, null);
  7767.         
  7768.         while(elmt = elmts.iterateNext()) {
  7769.             var field = doc.evaluate(''./TD[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  7770.             var ind1 = doc.evaluate(''./TD[2]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  7771.             var ind2 = doc.evaluate(''./TD[3]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  7772.             var value = doc.evaluate(''./TD[4]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  7773.             value = value.replace(/\\([a-z]) /g, marc.subfieldDelimiter+"$1");
  7774.             
  7775.             record.addField(field, ind1+ind2, value);
  7776.         }
  7777.         
  7778.         var newItem = new Zotero.Item();
  7779.         record.translate(newItem);
  7780.         
  7781.         var domain = url.match(/https?:\/\/([^/]+)/);
  7782.         newItem.repository = domain[1]+" Library Catalog";
  7783.         
  7784.         newItem.complete();
  7785.     }, function(){ Zotero.done(); }, null);
  7786.     
  7787.     Zotero.wait();
  7788. }');
  7789.  
  7790. REPLACE INTO translators VALUES ('fb12ae9e-f473-cab4-0546-27ab88c64101', '1.0.0b3.r1', '', '2006-12-15 15:11:00', 1, 100, 4, 'Library Catalog (DRA)', 'Simon Kornblith', '/web2/tramp2\.exe/(?:see\_record/|authority\_hits/|goto/.*\?.*screen=Record\.html)',
  7791. 'function detectWeb(doc, url) {
  7792.     if(doc.location.href.indexOf("/authority_hits") > 0) {
  7793.         return "multiple";
  7794.     } else {
  7795.         return "book";
  7796.     }
  7797. }',
  7798. 'function doWeb(doc, url) {
  7799.     var checkItems = false;
  7800.     
  7801.     if(doc.location.href.indexOf("/authority_hits") > 0) {
  7802.         var namespace = doc.documentElement.namespaceURI;
  7803.         var nsResolver = namespace ? function(prefix) {
  7804.             if (prefix == ''x'') return namespace; else return null;
  7805.         } : null;
  7806.         
  7807.         checkItems = Zotero.Utilities.gatherElementsOnXPath(doc, doc, "/html/body//ol/li", nsResolver);
  7808.     }
  7809.     
  7810.     if(checkItems && checkItems.length) {
  7811.         var items = Zotero.Utilities.getItemArray(doc, checkItems, ''https?://.*/web2/tramp2\.exe/see_record'');
  7812.         items = Zotero.selectItems(items);
  7813.         
  7814.         if(!items) {
  7815.             return true;
  7816.         }
  7817.         
  7818.         var uris = new Array();
  7819.         for(var i in items) {
  7820.             uris.push(i);
  7821.         }
  7822.     } else {
  7823.         var ug = new Array(doc.location.href);
  7824.     }
  7825.     
  7826.     for(var i in uris) {
  7827.         var uri = uris[i];
  7828.         var uriRegexp = /^(https?:\/\/.*\/web2\/tramp2\.exe\/)(?:goto|see\_record|authority\_hits)(\/.*)\?(?:screen=Record\.html\&)?(.*)$/i;
  7829.         var m = uriRegexp.exec(uri);
  7830.         if(uri.indexOf("/authority_hits") < 0) {
  7831.             var newUri = m[1]+"download_record"+m[2]+"/RECORD.MRC?format=marc&"+m[3];
  7832.         } else {
  7833.             var newUri = m[1]+"download_record"+m[2]+"/RECORD.MRC?format=marc";
  7834.         }
  7835.         
  7836.         // Keep track of how many requests have been completed
  7837.         var j = 0;
  7838.         
  7839.         var translator = Zotero.loadTranslator("import");
  7840.         translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  7841.         
  7842.         var domain = url.match(/https?:\/\/([^/]+)/);
  7843.         marc.setHandler("itemDone", function(obj, item) {
  7844.             item.repository = domain[1]+" Library Catalog";
  7845.             item.complete();
  7846.         });
  7847.         
  7848.         Zotero.Utilities.HTTP.doGet(newUri, function(text) {
  7849.             translator.setString(text);
  7850.             translator.translate();
  7851.             
  7852.             j++;
  7853.             if(j == uris.length) {
  7854.                 Zotero.done();
  7855.             }
  7856.         });
  7857.     }
  7858.     Zotero.wait();
  7859. }');
  7860.  
  7861. REPLACE INTO translators VALUES ('c0e6fda6-0ecd-e4f4-39ca-37a4de436e15', '1.0.0b3.r1', '', '2006-12-15 15:11:00', 1, 100, 4, 'Library Catalog (GEAC)', 'Simon Kornblith', '/(?:GeacQUERY|GeacFETCH[\:\?].*[&:]next=html/(?:record\.html|geacnffull\.html))',
  7862. 'function detectWeb(doc, url) {
  7863.     if(doc.location.href.indexOf("/GeacQUERY") > 0) {
  7864.         return "multiple";
  7865.     } else {
  7866.         return "book";
  7867.     }
  7868. }',
  7869. 'function doWeb(doc, url) {
  7870.     var uri = doc.location.href;
  7871.     
  7872.     var uris = new Array();
  7873.     
  7874.     if(uri.indexOf("/GeacQUERY") > 0) {
  7875.         var items = Zotero.Utilities.getItemArray(doc, doc, "(?:Geac)?FETCH[\:\?].*[&:]next=html/(?:record\.html|geacnffull\.html)");
  7876.         items = Zotero.selectItems(items);
  7877.         
  7878.         if(!items) {
  7879.             return true;
  7880.         }
  7881.         
  7882.         var uris = new Array();
  7883.         for(var i in items) {
  7884.             var newUri = i.replace(/([:&])next=html\/geacnffull.html/, "$1next=html/marc.html");
  7885.             newUri = newUri.replace(/([:&])next=html\/record.html/, "$1next=html/marc.html");
  7886.             uris.push(newUri);
  7887.         }
  7888.     } else {
  7889.         var newUri = uri.replace(/([:&])next=html\/geacnffull.html/, "$1next=html/marc.html");
  7890.         newUri = newUri.replace(/([:&])next=html\/record.html/, "$1next=html/marc.html");
  7891.         uris.push(newUri);
  7892.     }
  7893.     
  7894.     var translator = Zotero.loadTranslator("import");
  7895.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  7896.     var marc = translator.getTranslatorObject();
  7897.     
  7898.     Zotero.Utilities.processDocuments(uris, function(newDoc) {
  7899.         var uri = newDoc.location.href;
  7900.         
  7901.         var namespace = newDoc.documentElement.namespaceURI;
  7902.         var nsResolver = namespace ? function(prefix) {
  7903.           if (prefix == ''x'') return namespace; else return null;
  7904.         } : null;
  7905.         
  7906.         var record = new marc.record();
  7907.         
  7908.         var elmts = newDoc.evaluate(''//pre/text()'', newDoc, nsResolver,
  7909.                                     XPathResult.ANY_TYPE, null);
  7910.         var elmt, tag, content;
  7911.         var ind = "";
  7912.         
  7913.         while(elmt = elmts.iterateNext()) {
  7914.             var line = elmt.nodeValue;
  7915.             
  7916.             if(line.substring(0, 6) == "       ") {
  7917.                 content += " "+line.substring(6);
  7918.                 continue;
  7919.             } else {
  7920.                 if(tag) {
  7921.                     record.addField(tag, ind, content);
  7922.                 }
  7923.             }
  7924.             
  7925.             line = line.replace(/[_\t\xA0]/g," "); // nbsp
  7926.             
  7927.             tag = line.substr(0, 3);
  7928.             if(tag[0] != "0" || tag[1] != "0") {
  7929.                 ind = line.substr(4, 2);
  7930.                 content = line.substr(7).replace(/\$([a-z])(?: |$)/g, marc.subfieldDelimiter+"$1");
  7931.             } else {
  7932.                 if(tag == "000") {
  7933.                     tag = undefined;
  7934.                     record.leader = "00000"+line.substr(4);
  7935.                 } else {
  7936.                     content = line.substr(4);
  7937.                 }
  7938.             }
  7939.             
  7940.         }
  7941.         
  7942.         var newItem = new Zotero.Item();
  7943.         record.translate(newItem);
  7944.         
  7945.         var domain = url.match(/https?:\/\/([^/]+)/);
  7946.         newItem.repository = domain[1]+" Library Catalog";
  7947.         
  7948.         newItem.complete();
  7949.     }, function() { Zotero.done(); }, null);
  7950.     
  7951.     Zotero.wait();
  7952. }');
  7953.  
  7954. REPLACE INTO translators VALUES ('0f9fc2fc-306e-5204-1117-25bca009dffc', '1.0.0b3.r1', '', '2006-12-15 15:11:00', 1, 100, 4, 'Library Catalog (TLC/YouSeeMore)', 'Simon Kornblith', 'TLCScripts/interpac\.dll\?(?:.*LabelDisplay.*RecordNumber=[0-9]|Search|ItemTitles)',
  7955. 'function detectWeb(doc, url) {
  7956.     var detailRe = new RegExp("TLCScripts/interpac\.dll\?.*LabelDisplay.*RecordNumber=[0-9]");
  7957.     if(detailRe.test(doc.location.href)) {
  7958.         return "book";
  7959.     } else {
  7960.         return "multiple";
  7961.     }
  7962. }',
  7963. 'function doWeb(doc, url) {
  7964.     var namespace = doc.documentElement.namespaceURI;
  7965.     var nsResolver = namespace ? function(prefix) {
  7966.         if (prefix == ''x'') return namespace; else return null;
  7967.     } : null;
  7968.     
  7969.     var detailRe = new RegExp("TLCScripts/interpac\.dll\?.*LabelDisplay.*RecordNumber=[0-9]");
  7970.     var uri = doc.location.href;
  7971.     var newUris = new Array();
  7972.     
  7973.     if(detailRe.test(uri)) {
  7974.         newUris.push(uri.replace("LabelDisplay", "MARCDisplay"));
  7975.     } else {
  7976.         var items = Zotero.Utilities.getItemArray(doc, doc, ''TLCScripts/interpac\.dll\?.*LabelDisplay.*RecordNumber=[0-9]'');
  7977.         items = Zotero.selectItems(items);
  7978.         
  7979.         if(!items) {
  7980.             return true;
  7981.         }
  7982.         
  7983.         for(var i in items) {
  7984.             newUris.push(i.replace("LabelDisplay", "MARCDisplay"));
  7985.         }
  7986.     }
  7987.     
  7988.     var translator = Zotero.loadTranslator("import");
  7989.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  7990.     var marc = translator.getTranslatorObject();
  7991.     
  7992.     Zotero.Utilities.processDocuments(newUris, function(newDoc) {
  7993.         var uri = newDoc.location.href;
  7994.         
  7995.         var namespace = newDoc.documentElement.namespaceURI;
  7996.         var nsResolver = namespace ? function(prefix) {
  7997.           if (prefix == ''x'') return namespace; else return null;
  7998.         } : null;
  7999.         
  8000.         var record = new marc.record();
  8001.         
  8002.         var elmts = newDoc.evaluate(''/html/body/table/tbody/tr[td[4]]'', newDoc, nsResolver,
  8003.                                     XPathResult.ANY_TYPE, null);
  8004.         var tag, ind, content, elmt;
  8005.         
  8006.         while(elmt = elmts.iterateNext()) {
  8007.             tag = newDoc.evaluate(''./td[2]/tt[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  8008.             var inds = newDoc.evaluate(''./td[3]/tt[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  8009.             
  8010.             tag = tag.replace(/[\r\n]/g, "");
  8011.             inds = inds.replace(/[\r\n\xA0]/g, "");
  8012.             
  8013.             var children = newDoc.evaluate(''./td[4]/tt[1]//text()'', elmt, nsResolver,
  8014.                                            XPathResult.ANY_TYPE, null);
  8015.             var subfield = children.iterateNext();
  8016.             var fieldContent = children.iterateNext();
  8017.             
  8018.             if(tag == "LDR") {
  8019.                 record.leader = "00000"+subfield.nodeValue;
  8020.             } else {
  8021.                 content = "";
  8022.                 if(!fieldContent) {
  8023.                     content = subfield.nodeValue;
  8024.                 } else {
  8025.                     while(subfield && fieldContent) {
  8026.                         content += marc.subfieldDelimiter+subfield.nodeValue.substr(1, 1)+fieldContent.nodeValue;
  8027.                         var subfield = children.iterateNext();
  8028.                         var fieldContent = children.iterateNext();
  8029.                     }
  8030.                 }
  8031.                 
  8032.                 record.addField(tag, inds, content);
  8033.             }
  8034.         }
  8035.         
  8036.         var newItem = new Zotero.Item();
  8037.         record.translate(newItem);
  8038.         
  8039.         var domain = url.match(/https?:\/\/([^/]+)/);
  8040.         newItem.repository = domain[1]+" Library Catalog";
  8041.         
  8042.         newItem.complete();
  8043.     }, function() {Zotero.done(); }, null);
  8044.     
  8045.     Zotero.wait();
  8046. }');
  8047.  
  8048. REPLACE INTO translators VALUES ('c54d1932-73ce-dfd4-a943-109380e06574', '1.0.0b4.r1', '', '2008-01-13 19:30:00', '1', '100', '4', 'Project MUSE', 'Simon Kornblith', 'https?://[^/]*muse\.jhu\.edu[^/]*/(?:journals/[^/]+/[^/]+/[^/]+\.html|search/results)', 
  8049. 'function detectWeb(doc, url) {
  8050.     var searchRe = new RegExp("^https?://[^/]+/search/results");
  8051.     if(searchRe.test(url)) {
  8052.         return "multiple";
  8053.     } else {
  8054.         return "journalArticle";
  8055.     }
  8056. }', 
  8057. 'function doWeb(doc, url) {
  8058.     var namespace = doc.documentElement.namespaceURI;
  8059.     var nsResolver = namespace ? function(prefix) {
  8060.         if (prefix == ''x'') return namespace; else return null;
  8061.     } : null;
  8062.     
  8063.     var searchRe = new RegExp("^https?://[^/]+/search/results");
  8064.     if(searchRe.test(doc.location.href)) {
  8065.         var items = new Array();
  8066.         var attachments = new Array();
  8067.         var pdfRe = /\.pdf$/i;
  8068.         var htmlRe = /\.html$/i;
  8069.         
  8070.         var tableRows = doc.evaluate(''/html/body/table[@class="navbar"]/tbody/tr/td/form/table'',
  8071.                                      doc, nsResolver, XPathResult.ANY_TYPE, null);
  8072.         var tableRow;
  8073.         // Go through table rows
  8074.         while(tableRow = tableRows.iterateNext()) {
  8075.             // aid (article id) is what we need to get it all as one file
  8076.             var input = doc.evaluate(''./tbody/tr/td/input[@name="aid"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  8077.             var title = doc.evaluate(''.//b/i/text()'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  8078.             if(input && input.value && title && title.nodeValue) {
  8079.                 items[input.value] = title.nodeValue;
  8080.                 
  8081.                 var aTags = tableRow.getElementsByTagName("a");
  8082.                 
  8083.                 // get attachments
  8084.                 attachments[input.value] = new Array();
  8085.                 for(var i=0; i<aTags.length; i++) {
  8086.                     if(pdfRe.test(aTags[i].href)) {
  8087.                         attachments[input.value].push({url:aTags[i].href,
  8088.                                                       title:"Project MUSE Full Text PDF",
  8089.                                                       mimeType:"application/pdf"});
  8090.                     } else if(htmlRe.test(aTags[i].href)) {
  8091.                         attachments[input.value].push({url:aTags[i].href,
  8092.                                                       title:"Project MUSE Snapshot",
  8093.                                                       mimeType:"text/html"});
  8094.                     }
  8095.                 }
  8096.             }
  8097.         }
  8098.         
  8099.         items = Zotero.selectItems(items);
  8100.         if(!items) {
  8101.             return true;
  8102.         }
  8103.         
  8104.         var articleString = "";
  8105.         var newAttachments = new Array();
  8106.         for(var i in items) {
  8107.             articleString += "&aid="+i;
  8108.             newAttachments.push(attachments[i]);
  8109.         }
  8110.         
  8111.         Zotero.Utilities.HTTP.doGet("http://muse.jhu.edu/search/export.cgi?exporttype=endnote"+articleString, function(text) {
  8112.             // load translator for RIS
  8113.             var translator = Zotero.loadTranslator("import");
  8114.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  8115.             translator.setString(text);
  8116.             translator.setHandler("itemDone", function(obj, item) {
  8117.                 if(item.notes && item.notes[0]) {
  8118.                     item.extra = item.notes[0].note;                        
  8119.                     delete item.notes;
  8120.                     item.notes = undefined;
  8121.                 }
  8122.                 item.attachments = newAttachments.shift();
  8123.                 item.complete();
  8124.             });
  8125.             translator.translate();
  8126.             Zotero.done();
  8127.         }, function() {});
  8128.         
  8129.         Zotero.wait();
  8130.     } else {
  8131.         var hostRe = new RegExp("^(http://[^/]+)/");
  8132.         var m = hostRe.exec(url);
  8133.         var host = m[1];
  8134.  
  8135.         var getPDF = doc.evaluate(''//a[text() = "[Access article in PDF]"]'', doc,
  8136.                                   nsResolver, XPathResult.ANY_TYPE, null).iterateNext();        
  8137.         
  8138.         var newUrl = url.replace(host, host+"/metadata/zotero");
  8139.         Zotero.Utilities.HTTP.doGet(newUrl, function(text) {
  8140.             var translator = Zotero.loadTranslator("import");
  8141.             //set RIS translator
  8142.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  8143.             translator.setString(text);
  8144.             translator.setHandler("itemDone", function(obj, item) {
  8145.                 if(item.notes && item.notes[0]) {
  8146.                     item.extra = item.notes[0].note;                        
  8147.                     delete item.notes;
  8148.                     item.notes = undefined;
  8149.                 }
  8150.                 item.attachments.splice(0);
  8151.                 item.attachments.push({document:doc, title:"Project MUSE Snapshot"});
  8152.                 if(getPDF) {
  8153.                     item.attachments.push({title:"Project MUSE Full Text PDF", mimeType:"application/pdf",
  8154.                     url:getPDF.href});
  8155.                 }
  8156.                 
  8157.                 item.complete();
  8158.             });
  8159.             translator.translate();
  8160.         });
  8161.     }
  8162. }');
  8163.  
  8164. REPLACE INTO translators VALUES ('fcf41bed-0cbc-3704-85c7-8062a0068a7a', '1.0.0b3.r1', '', '2008-01-23 18:30:00', '1', '100', '4', 'NCBI PubMed', 'Simon Kornblith and Michael Berkowitz', 'http://[^/]*www\.ncbi\.nlm\.nih\.gov[^/]*/(pubmed|sites/entrez|entrez/query\.fcgi\?.*db=PubMed)', 
  8165. 'function detectWeb(doc, url) {
  8166.     var namespace = doc.documentElement.namespaceURI;
  8167.     var nsResolver = namespace ? function(prefix) {
  8168.         if (prefix == ''x'') return namespace; else return null;
  8169.     } : null;
  8170.  
  8171.     var uids = doc.evaluate(''//input[@id="UidCheckBox" or @name="uid"]'', doc,
  8172.                    nsResolver, XPathResult.ANY_TYPE, null);
  8173.     if(uids.iterateNext() && doc.title.indexOf("PMC Results") == -1) {
  8174.         if (uids.iterateNext() && doc.title.indexOf("PMC Results") == -1){
  8175.             return "multiple";
  8176.         }
  8177.         return "journalArticle";
  8178.     }
  8179. }
  8180. function getPMID(co) {
  8181.     var coParts = co.split("&");
  8182.     for each(part in coParts) {
  8183.         if(part.substr(0, 7) == "rft_id=") {
  8184.             var value = unescape(part.substr(7));
  8185.             if(value.substr(0, 10) == "info:pmid/") {
  8186.                 return value.substr(10);
  8187.             }
  8188.         }
  8189.     }
  8190. }
  8191.  
  8192. function detectSearch(item) {
  8193.     if(item.contextObject) {
  8194.         if(getPMID(item.contextObject)) {
  8195.             return "journalArticle";
  8196.         }
  8197.     }
  8198.     return false;
  8199. }
  8200. ', 
  8201. 'function lookupPMIDs(ids, doc) {
  8202.     Zotero.wait();
  8203.  
  8204.     var newUri = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=PubMed&retmode=xml&rettype=citation&id="+ids.join(",");
  8205.     Zotero.Utilities.HTTP.doGet(newUri, function(text) {
  8206.         // Remove xml parse instruction and doctype
  8207.         text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
  8208.  
  8209.         var xml = new XML(text);
  8210.  
  8211.         for(var i=0; i<xml.PubmedArticle.length(); i++) {
  8212.             var newItem = new Zotero.Item("journalArticle");
  8213.  
  8214.             var citation = xml.PubmedArticle[i].MedlineCitation;
  8215.  
  8216.             var PMID = citation.PMID.text().toString();
  8217. //            newItem.accessionNumber = "PMID "+PMID;
  8218.             newItem.extra = "PMID: "+PMID;
  8219.             // add attachments
  8220.             if(doc) {
  8221.                 newItem.attachments.push({document:doc, title:"PubMed Snapshot"});
  8222.             } else {
  8223.                 var url = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=pubmed&cmd=Retrieve&dopt=AbstractPlus&list_uids="+PMID;
  8224.                 newItem.attachments.push({url:url, title:"PubMed Snapshot",
  8225.                              mimeType:"text/html"});
  8226.             }
  8227.  
  8228.             var article = citation.Article;
  8229.             if(article.ArticleTitle.length()) {
  8230.                 var title = article.ArticleTitle.text().toString();
  8231.                 if(title.substr(-1) == ".") {
  8232.                     title = title.substring(0, title.length-1);
  8233.                 }
  8234.                 newItem.title = title;
  8235.             }
  8236.  
  8237.             if (article.Pagination.MedlinePgn.length()){
  8238.                 newItem.pages = article.Pagination.MedlinePgn.text().toString();
  8239.             }
  8240.  
  8241.             if(article.Journal.length()) {
  8242.                 var issn = article.Journal.ISSN.text().toString();
  8243.                 if(issn) {
  8244.                     newItem.ISSN = issn.replace(/[^0-9]/g, "");
  8245.                 }
  8246.  
  8247.                 newItem.journalAbbreviation = Zotero.Utilities.superCleanString(citation.MedlineJournalInfo.MedlineTA.text().toString());
  8248.                 if(article.Journal.Title.length()) {
  8249.                     newItem.publicationTitle = Zotero.Utilities.superCleanString(article.Journal.Title.text().toString());
  8250.                 } else if(citation.MedlineJournalInfo.MedlineTA.length()) {
  8251.                     newItem.publicationTitle = newItem.journalAbbreviation;
  8252.                 }
  8253.  
  8254.                 if(article.Journal.JournalIssue.length()) {
  8255.                     newItem.volume = article.Journal.JournalIssue.Volume.text().toString();
  8256.                     newItem.issue = article.Journal.JournalIssue.Issue.text().toString();
  8257.                     if(article.Journal.JournalIssue.PubDate.length()) {    // try to get the date
  8258.                         if(article.Journal.JournalIssue.PubDate.Day.text().toString() != "") {
  8259.                             newItem.date = article.Journal.JournalIssue.PubDate.Month.text().toString()+" "+article.Journal.JournalIssue.PubDate.Day.text().toString()+", "+article.Journal.JournalIssue.PubDate.Year.text().toString();
  8260.                         } else if(article.Journal.JournalIssue.PubDate.Month.text().toString() != "") {
  8261.                             newItem.date = article.Journal.JournalIssue.PubDate.Month.text().toString()+" "+article.Journal.JournalIssue.PubDate.Year.text().toString();
  8262.                         } else if(article.Journal.JournalIssue.PubDate.Year.text().toString() != "") {
  8263.                             newItem.date = article.Journal.JournalIssue.PubDate.Year.text().toString();
  8264.                         }
  8265.                     }
  8266.                 }
  8267.             }
  8268.  
  8269.             if(article.AuthorList.length() && article.AuthorList.Author.length()) {
  8270.                 var authors = article.AuthorList.Author;
  8271.                 for(var j=0; j<authors.length(); j++) {
  8272.                     var lastName = authors[j].LastName.text().toString();
  8273.                     var firstName = authors[j].FirstName.text().toString();
  8274.                     if(firstName == "") {
  8275.                         var firstName = authors[j].ForeName.text().toString();
  8276.                     }
  8277.                     if(firstName || lastName) {
  8278.                         newItem.creators.push({lastName:lastName, firstName:firstName});
  8279.                     }
  8280.                 }
  8281.             }
  8282.             
  8283.             
  8284.             if (citation.MeshHeadingList && citation.MeshHeadingList.MeshHeading) {
  8285.                 var keywords = citation.MeshHeadingList.MeshHeading;
  8286.                 for (var k = 0 ; k < keywords.length() ; k++) {
  8287.                     newItem.tags.push(keywords[k].DescriptorName.text().toString());
  8288.                 }
  8289.             }
  8290.             newItem.abstractNote = article.Abstract.AbstractText.toString()
  8291.             
  8292.             newItem.complete();
  8293.         }
  8294.  
  8295.         Zotero.done();
  8296.     });
  8297. }
  8298.  
  8299. function doWeb(doc, url) {
  8300.     var namespace = doc.documentElement.namespaceURI;
  8301.     var nsResolver = namespace ? function(prefix) {
  8302.         if (prefix == ''x'') return namespace; else return null;
  8303.         } : null;
  8304.     var ids = new Array();
  8305.     var uids = doc.evaluate(''//input[@id="UidCheckBox" or @name="uid"]'', doc, //edited for new PubMed
  8306.                    nsResolver, XPathResult.ANY_TYPE, null);
  8307.     var uid = uids.iterateNext();
  8308.     if(uid) {
  8309.         if (uids.iterateNext()){
  8310.             var items = new Array();
  8311.             var tableRows = doc.evaluate(''//div[@class="rprt"]'', doc, // edited for new PubMed
  8312.                          nsResolver, XPathResult.ANY_TYPE, null);
  8313.             
  8314.             var tableRow;
  8315.             // Go through table rows
  8316.             while(tableRow = tableRows.iterateNext()) {
  8317.                 uid = doc.evaluate(''.//input[@id="UidCheckBox"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  8318.                 var article = doc.evaluate(''.//div[@class="title"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  8319.                 items[uid.value] = article.textContent;
  8320.             }
  8321.  
  8322.             items = Zotero.selectItems(items);
  8323.  
  8324.             if(!items) {
  8325.                 return true;
  8326.             }
  8327.  
  8328.             for(var i in items) {
  8329.                 ids.push(i);
  8330.             }
  8331.  
  8332.             lookupPMIDs(ids);
  8333.         } else {
  8334.             ids.push(uid.value);
  8335.             lookupPMIDs(ids, doc);
  8336.         }
  8337.     }
  8338. }
  8339.  
  8340. function doSearch(item) {
  8341.     // pmid was defined earlier in detectSearch
  8342.     lookupPMIDs([getPMID(item.contextObject)]);
  8343. }');
  8344.  
  8345. REPLACE INTO translators VALUES ('951c027d-74ac-47d4-a107-9c3069ab7b48', '1.0.0b3.r1', '', '2007-08-04 23:15:00', 1, 400, 4, 'Embedded RDF', 'Simon Kornblith', NULL,
  8346. 'function detectWeb(doc, url) {
  8347.     var metaTags = doc.getElementsByTagName("meta");
  8348.     
  8349.     for(var i=0; i<metaTags.length; i++) {
  8350.         var tag = metaTags[i].getAttribute("name");
  8351.         if(tag && tag.substr(0, 3).toLowerCase() == "dc.") {
  8352.             return "webpage";
  8353.         }
  8354.     }
  8355.     
  8356.     return false;
  8357. }',
  8358. 'function doWeb(doc, url) {
  8359.     var dc = "http://purl.org/dc/elements/1.1/";
  8360.  
  8361.     // load RDF translator, so that we don''t need to replicate import code
  8362.     var translator = Zotero.loadTranslator("import");
  8363.     translator.setTranslator("5e3ad958-ac79-463d-812b-a86a9235c28f");
  8364.     translator.setHandler("itemDone", function(obj, newItem) {
  8365.         // use document title if none given in dublin core
  8366.         if(!newItem.title) {
  8367.             newItem.title = doc.title;
  8368.         }
  8369.         // add attachment
  8370.         newItem.attachments.push({document:doc});
  8371.         // add url
  8372.         newItem.url = doc.location.href;
  8373.         newItem.repository = false;
  8374.         newItem.complete();
  8375.     });
  8376.     var rdf = translator.getTranslatorObject();
  8377.     
  8378.     var metaTags = doc.getElementsByTagName("meta");
  8379.     var foundTitle = false;        // We can use the page title if necessary
  8380.     for(var i=0; i<metaTags.length; i++) {
  8381.         var tag = metaTags[i].getAttribute("name");
  8382.         var value = metaTags[i].getAttribute("content");
  8383.         if(tag && value && tag.substr(0, 3).toLowerCase() == "dc.") {
  8384.             if(tag == "dc.title") {
  8385.                 foundTitle = true;
  8386.             }
  8387.             rdf.Zotero.RDF.addStatement(url, dc + tag.substr(3).toLowerCase(), value, true);
  8388.         } else if(tag && value && (tag == "author" || tag == "author-personal")) {
  8389.             rdf.Zotero.RDF.addStatement(url, dc + "creator", value, true);
  8390.         } else if(tag && value && tag == "author-corporate") {
  8391.             rdf.Zotero.RDF.addStatement(url, dc + "creator", value, true);
  8392.         }
  8393.     }
  8394.     
  8395.     rdf.defaultUnknownType = "webpage";
  8396.     rdf.doImport();
  8397. }');
  8398.  
  8399. REPLACE INTO translators VALUES ('05d07af9-105a-4572-99f6-a8e231c0daef', '1.0.0b3.r1', '', '2007-09-15 20:08:46', 1, 300, 4, 'COinS', 'Simon Kornblith', NULL,
  8400. 'function detectWeb(doc, url) {
  8401.     var spanTags = doc.getElementsByTagName("span");
  8402.     
  8403.     var encounteredType = false;
  8404.     
  8405.     for(var i=0; i<spanTags.length; i++) {
  8406.         var spanClass = spanTags[i].getAttribute("class");
  8407.         if(spanClass) {
  8408.             var spanClasses = spanClass.split(" ");
  8409.             if(Zotero.Utilities.inArray("Z3988", spanClasses)) {
  8410.                 var spanTitle = spanTags[i].getAttribute("title");
  8411.                 
  8412.                 // determine if it''s a valid type
  8413.                 var item = new Zotero.Item;
  8414.                 var success = Zotero.Utilities.parseContextObject(spanTitle, item);
  8415.                 
  8416.                 if(item.itemType) {
  8417.                     if(encounteredType) {
  8418.                         return "multiple";
  8419.                     } else {
  8420.                         encounteredType = item.itemType;
  8421.                     }
  8422.                 }
  8423.             }
  8424.         }
  8425.     }
  8426.     
  8427.     return encounteredType;
  8428. }',
  8429. '// used to retrieve next COinS object when asynchronously parsing COinS objects
  8430. // on a page
  8431. function retrieveNextCOinS(needFullItems, newItems, couldUseFullItems, doc) {
  8432.     if(needFullItems.length) {
  8433.         var item = needFullItems.shift();
  8434.         
  8435.         Zotero.debug("looking up contextObject");
  8436.         var search = Zotero.loadTranslator("search");
  8437.         search.setHandler("itemDone", function(obj, item) {
  8438.             newItems.push(item);
  8439.         });
  8440.         search.setHandler("done", function() {
  8441.             retrieveNextCOinS(needFullItems, newItems, couldUseFullItems, doc);
  8442.         });
  8443.         search.setSearch(item);
  8444.         
  8445.         // look for translators
  8446.         var translators = search.getTranslators();
  8447.         if(translators.length) {
  8448.             search.setTranslator(translators);
  8449.             search.translate();
  8450.         } else {
  8451.             retrieveNextCOinS(needFullItems, newItems, couldUseFullItems, doc);
  8452.         }
  8453.     } else {
  8454.         completeCOinS(newItems, couldUseFullItems, doc);
  8455.         Zotero.done();
  8456.     }
  8457. }
  8458.  
  8459. // saves all COinS objects
  8460. function completeCOinS(newItems, couldUseFullItems, doc) {
  8461.     if(newItems.length > 1) {
  8462.         var selectArray = new Array();
  8463.         
  8464.         for(var i in newItems) {
  8465.             selectArray[i] = newItems[i].title;
  8466.         }
  8467.         selectArray = Zotero.selectItems(selectArray);
  8468.         
  8469.         var useIndices = new Array();
  8470.         for(var i in selectArray) {
  8471.             useIndices.push(i);
  8472.         }
  8473.         completeItems(newItems, useIndices, couldUseFullItems);
  8474.     } else if(newItems.length) {
  8475.         completeItems(newItems, [0], couldUseFullItems);
  8476.     }
  8477. }
  8478.  
  8479. function completeItems(newItems, useIndices, couldUseFullItems, doc) {
  8480.     if(!useIndices.length) {
  8481.         return;
  8482.     }
  8483.     var i = useIndices.shift();
  8484.     
  8485.     // grab full item if the COinS was missing an author
  8486.     if(couldUseFullItems[i]) {
  8487.         Zotero.debug("looking up contextObject");
  8488.         var search = Zotero.loadTranslator("search");
  8489.         
  8490.         var firstItem = false;
  8491.         search.setHandler("itemDone", function(obj, newItem) {
  8492.             if(!firstItem) {
  8493.                 // add doc as attachment
  8494.                 newItem.attachments.push({document:doc});
  8495.                 newItem.complete();
  8496.                 firstItem = true;
  8497.             }
  8498.         });
  8499.         search.setHandler("done", function(obj) {
  8500.             // if we didn''t find anything, use what we had before (even if it
  8501.             // lacks the creator)
  8502.             if(!firstItem) {
  8503.                 newItems[i].complete();
  8504.             }
  8505.             // call next
  8506.             completeItems(newItems, useIndices, couldUseFullItems);
  8507.         });
  8508.         
  8509.         search.setSearch(newItems[i]);            
  8510.         var translators = search.getTranslators();
  8511.         if(translators.length) {
  8512.             search.setTranslator(translators);
  8513.             search.translate();
  8514.         } else {
  8515.             // add doc as attachment
  8516.             newItems[i].attachments.push({document:doc});
  8517.             newItems[i].complete();
  8518.             // call next
  8519.             completeItems(newItems, useIndices, couldUseFullItems);
  8520.         }
  8521.     } else {
  8522.         // add doc as attachment
  8523.         newItems[i].attachments.push({document:doc});
  8524.         newItems[i].complete();
  8525.         // call next
  8526.         completeItems(newItems, useIndices, couldUseFullItems);
  8527.     }
  8528. }
  8529.  
  8530. function doWeb(doc, url) {
  8531.     var newItems = new Array();
  8532.     var needFullItems = new Array();
  8533.     var couldUseFullItems = new Array();
  8534.     
  8535.     var spanTags = doc.getElementsByTagName("span");
  8536.     
  8537.     for(var i=0; i<spanTags.length; i++) {
  8538.         var spanClass = spanTags[i].getAttribute("class");
  8539.         if(spanClass) {
  8540.             var spanClasses = spanClass.split(" ");
  8541.             if(Zotero.Utilities.inArray("Z3988", spanClasses)) {
  8542.                 var spanTitle = spanTags[i].getAttribute("title");
  8543.                 var newItem = new Zotero.Item();
  8544.                 newItem.repository = false;    // do not save repository
  8545.                 if(Zotero.Utilities.parseContextObject(spanTitle, newItem)) {
  8546.                     if(newItem.title) {
  8547.                         if(!newItem.creators.length) {
  8548.                             // if we have a title but little other identifying
  8549.                             // information, say we''ll get full item later
  8550.                             newItem.contextObject = spanTitle;
  8551.                             couldUseFullItems[newItems.length] = true;
  8552.                         }
  8553.                         
  8554.                         // title and creators are minimum data to avoid looking up
  8555.                         newItems.push(newItem);
  8556.                     } else {
  8557.                         // retrieve full item
  8558.                         newItem.contextObject = spanTitle;
  8559.                         needFullItems.push(newItem);
  8560.                     }
  8561.                 }
  8562.             }
  8563.         }
  8564.     }
  8565.     
  8566.     Zotero.debug(needFullItems);
  8567.     if(needFullItems.length) {
  8568.         // retrieve full items asynchronously
  8569.         Zotero.wait();
  8570.         retrieveNextCOinS(needFullItems, newItems, couldUseFullItems, doc);
  8571.     } else {
  8572.         completeCOinS(newItems, couldUseFullItems, doc);
  8573.     }
  8574. }');
  8575.  
  8576. REPLACE INTO translators VALUES ('e7e01cac-1e37-4da6-b078-a0e8343b0e98', '1.0.0b4.r1', '', '2007-08-04 23:15:00', '1', '200', '4', 'unAPI', 'Simon Kornblith', '', 
  8577. 'var RECOGNIZABLE_FORMATS = ["mods", "marc", "endnote", "ris", "bibtex", "rdf"];
  8578. var FORMAT_GUIDS = {
  8579.     "mods":"0e2235e7-babf-413c-9acf-f27cce5f059c",
  8580.     "marc":"a6ee60df-1ddc-4aae-bb25-45e0537be973",
  8581.     "endnote":"881f60f2-0802-411a-9228-ce5f47b64c7d",
  8582.     "ris":"32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7",
  8583.     "bibtex":"9cb70025-a888-4a29-a210-93ec52da40d4",
  8584.     "rdf":"5e3ad958-ac79-463d-812b-a86a9235c28f"
  8585. };
  8586.  
  8587. var unAPIResolver, unsearchedIds, foundIds, foundItems, foundFormat, foundFormatName;
  8588.  
  8589. function detectWeb(doc, url) {
  8590.     // initialize variables
  8591.     unsearchedIds = [];
  8592.     foundIds = [];
  8593.     foundItems = [];
  8594.     foundFormat = [];
  8595.     foundFormatName = [];
  8596.     
  8597.     var nsResolver = doc.createNSResolver(doc.documentElement);
  8598.     
  8599.     // look for a resolver
  8600.     unAPIResolver = doc.evaluate(''//link[@rel="unapi-server"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  8601.     if(!unAPIResolver) return false;
  8602.     unAPIResolver = unAPIResolver.getAttribute("href");
  8603.     
  8604.     // look for abbrs
  8605.     var abbrs = doc.getElementsByTagName("abbr");
  8606.     for each(var abbr in abbrs) {
  8607.         if(abbr.getAttribute && abbr.getAttribute("class") &&
  8608.            abbr.getAttribute("class").split(" ").indexOf("unapi-id") != -1 && abbr.getAttribute("title")) {
  8609.             // found an abbr
  8610.             unsearchedIds.push(escape(abbr.getAttribute("title")));
  8611.         }
  8612.     }
  8613.     
  8614.     if(!unsearchedIds.length) return false;
  8615.     
  8616.     // now we need to see if the server actually gives us bibliographic metadata.
  8617.     
  8618.     // one way to signal this is with a META tag
  8619.     var zoteroMeta = doc.evaluate(''//meta[@name="ZoteroItemType"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  8620.     if(zoteroMeta) return zoteroMeta.getAttribute("content");
  8621.     
  8622.     // otherwise, things will be a bit more complicated, and we''ll have to do some HTTP requests
  8623.     Zotero.wait();
  8624.     
  8625.     if(unsearchedIds.length == 1) {
  8626.         // if there''s only one abbr tag, we should go ahead and retrieve types for it
  8627.         getItemType();
  8628.     } else {
  8629.         // if there''s more than one, we should first see if the resolver gives metadata for all of them
  8630.         Zotero.Utilities.HTTP.doGet(unAPIResolver, function(text) {
  8631.             var format = checkFormats(text);
  8632.             if(format) {
  8633.                 // move unsearchedIds to foundIds
  8634.                 foundIds = unsearchedIds;
  8635.                 unsearchedIds = [];
  8636.                 // save format and formatName
  8637.                 foundFormat = format[0];
  8638.                 foundFormatName = format[1];
  8639.                 
  8640.                 Zotero.done("multiple");
  8641.             } else {
  8642.                 getItemType();
  8643.             }
  8644.         });
  8645.     }
  8646. }
  8647.  
  8648. function getItemType() {
  8649.     // if there are no items left to search, use the only item''s type (if there is one) or give up
  8650.     if(!unsearchedIds.length) {
  8651.         if(foundIds.length) {
  8652.             getOnlyItem();
  8653.         } else {
  8654.             Zotero.done(false);
  8655.         }
  8656.         return;
  8657.     }
  8658.     
  8659.     var id = unsearchedIds.shift();
  8660.     Zotero.Utilities.HTTP.doGet(unAPIResolver+"?id="+id, function(text) {
  8661.         var format = checkFormats(text);
  8662.         if(format) {
  8663.             // save data
  8664.             foundIds.push(id);
  8665.             foundFormat.push(format[0]);
  8666.             foundFormatName.push(format[1]);
  8667.             
  8668.             if(foundIds.length == 2) {
  8669.                 // this is our second; use multiple
  8670.                 Zotero.done("multiple");
  8671.                 return;
  8672.             }
  8673.         }
  8674.         
  8675.         // keep going
  8676.         getItemType();
  8677.     });
  8678. }
  8679.  
  8680. function checkFormats(text) {
  8681.     text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
  8682.     var xml = new XML(text);
  8683.     
  8684.     var foundFormat = new Object();
  8685.     
  8686.     // this is such an ugly, disgusting hack, and I hate how Mozilla decided to neuter an ECMA standard
  8687.     for each(var format in xml.format) {
  8688.         var name = format.@name.toString();
  8689.         var lowerName = name.toLowerCase();
  8690.         
  8691.         if(format.@namespace_uri == "http://www.loc.gov/mods/v3" || lowerName == "mods" || format.@docs == "http://www.loc.gov/standards/mods/") {
  8692.             if(!foundFormat["mods"] || lowerName.indexOf("full") != -1) {
  8693.                 foundFormat["mods"] = escape(name);
  8694.             }
  8695.         } else if(lowerName.match(/^marc\b/)) {
  8696.             if(!foundFormat["marc"] || lowerName.indexOf("utf8") != -1) {
  8697.                 foundFormat["marc"] = escape(name);
  8698.             }
  8699.         } else if(lowerName == "rdf_dc") {
  8700.             foundFormat["rdf"] = escape(name);
  8701.         } else if(format.@docs.text() == "http://www.refman.com/support/risformat_intro.asp" || lowerName.match(/^ris\b/)) {
  8702.             if(!foundFormat["ris"] || lowerName.indexOf("utf8") != -1) {
  8703.                 foundFormat["ris"] = escape(name);
  8704.             }
  8705.         } else if(lowerName == "bibtex") {
  8706.             foundFormat["bibtex"] = escape(name);
  8707.         } else if(lowerName == "endnote") {
  8708.             foundFormat["endnote"] = escape(name);
  8709.         }
  8710.     }
  8711.     
  8712.     // loop through again, this time respecting preferences
  8713.     for each(var format in RECOGNIZABLE_FORMATS) {
  8714.         if(foundFormat[format]) return [format, foundFormat[format]];
  8715.     }
  8716.     
  8717.     return false;
  8718. }
  8719.  
  8720. function getOnlyItem() {
  8721.     // retrieve the only item
  8722.     retrieveItem(foundIds[0], foundFormat[0], foundFormatName[0], function(obj, item) {
  8723.         foundItems.push(item);
  8724.         Zotero.done(item.itemType);
  8725.     });
  8726. }
  8727.  
  8728. function retrieveItem(id, format, formatName, callback) {
  8729.     // retrieve URL
  8730.     Zotero.Utilities.HTTP.doGet(unAPIResolver+"?id="+id+"&format="+formatName, function(text) {
  8731.         var translator = Zotero.loadTranslator("import");
  8732.         translator.setTranslator(FORMAT_GUIDS[format]);
  8733.         translator.setString(text);
  8734.         translator.setHandler("itemDone", callback);
  8735.         translator.translate();
  8736.     });
  8737. }', 
  8738. '/**
  8739.  * Get formats and names for all usable ids; when done, get all items
  8740.  **/
  8741. function getAllIds() {
  8742.     if(!unsearchedIds.length) {
  8743.         // once all ids have been gotten, get all items
  8744.         getAllItems();
  8745.         return;
  8746.     }
  8747.     
  8748.     var id = unsearchedIds.shift();
  8749.     Zotero.Utilities.HTTP.doGet(unAPIResolver+"?id="+id, function(text) {
  8750.         var format = checkFormats(text);
  8751.         if(format) {
  8752.             // save data
  8753.             foundIds.push(id);
  8754.             foundFormat.push(format[0]);
  8755.             foundFormatName.push(format[1]);
  8756.         }
  8757.         
  8758.         // keep going
  8759.         getAllIds();
  8760.     });
  8761. }
  8762.  
  8763. /**
  8764.  * Get all items; when done, show selectItems or scrape
  8765.  **/
  8766. function getAllItems() {
  8767.     if(foundItems.length == foundIds.length) {
  8768.         if(foundItems.length == 1) {
  8769.             // if only one item, send complete()
  8770.             foundItems[0].complete();
  8771.         } else if(foundItems.length > 0) {
  8772.             // if multiple items, show selectItems
  8773.             var itemTitles = [];
  8774.             for(var i in foundItems) {
  8775.                 itemTitles[i] = foundItems[i].title;
  8776.             }
  8777.             
  8778.             var chosenItems = Zotero.selectItems(itemTitles);
  8779.             if(!chosenItems) Zotero.done(true);
  8780.             
  8781.             for(var i in chosenItems) {
  8782.                 foundItems[i].complete();
  8783.             }
  8784.         }
  8785.         
  8786.         // reset items
  8787.         foundItems = [];
  8788.         
  8789.         Zotero.done();
  8790.         return;
  8791.     }
  8792.     
  8793.     var id = foundIds[foundItems.length];
  8794.     // foundFormat can be either a string or an array
  8795.     if(typeof(foundFormat) == "string") {
  8796.         var format = foundFormat;
  8797.         var formatName = foundFormatName;
  8798.     } else {
  8799.         var format = foundFormat[foundItems.length];
  8800.         var formatName = foundFormatName[foundItems.length];
  8801.     }
  8802.     
  8803.     // get item
  8804.     retrieveItem(id, format, formatName, function(obj, item) {
  8805.         foundItems.push(item);
  8806.         getAllItems();
  8807.     });
  8808. }
  8809.  
  8810. function doWeb() {
  8811.     Zotero.wait();
  8812.     
  8813.     // retrieve data for all ids
  8814.     getAllIds();
  8815. }');
  8816.  
  8817. REPLACE INTO translators VALUES ('a326fc49-60c2-405b-8f44-607e5d18b9ad', '1.0.0b4.r5', '', '2008-01-25 20:00:00', '0', '100', '4', 'Code4Lib Journal', 'Michael Berkowitz', 'http://journal.code4lib.org/', 
  8818. 'function detectWeb(doc, url) {
  8819.     if (doc.evaluate(''//h2[@class="articletitle"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  8820.         return "multiple";
  8821.     } else if (doc.evaluate(''//h1[@class="articletitle"]/a'', doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
  8822.         return "journalArticle";
  8823.     }
  8824. }', 
  8825. 'function doWeb(doc, url) {
  8826.     var items = new Object();
  8827.     var articles = new Array();
  8828.     var xpath = ''//div[@class="article"]/h2[@class="articletitle"]/a'';
  8829.     if (detectWeb(doc, url) == "multiple") {
  8830.         var xpath = ''//div[@class="article"]/h2[@class="articletitle"]/a'';
  8831.         var titles = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  8832.         var next_title = titles.iterateNext();
  8833.         while (next_title) {
  8834.             items[next_title.href] = next_title.textContent;
  8835.             next_title = titles.iterateNext();
  8836.         }
  8837.         
  8838.         items = Zotero.selectItems(items);
  8839.         for (var i in items) {
  8840.             articles.push(i);
  8841.         }
  8842.     } else {
  8843.         articles.push(url);
  8844.     }
  8845.     
  8846.     Zotero.Utilities.processDocuments(articles, function(newDoc, url) {
  8847.         var newItem = new Zotero.Item("journalArticle");
  8848.         newItem.repository = "Code4Lib Journal";
  8849.         newItem.publicationTitle = "The Code4Lib Journal";
  8850.         newItem.ISSN = "1940-5758";
  8851.         newItem.url = newDoc.location.href;
  8852.         newItem.title = newDoc.evaluate(''//div[@class="article"]/h1[@class="articletitle"]/a'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  8853.         newItem.abstractNote = newDoc.evaluate(''//div[@class="article"]/div[@class="abstract"]/p'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  8854.         var issdate = newDoc.evaluate(''//p[@id="issueDesignation"]'', newDoc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  8855.         newItem.issue = issdate.match(/([^,]*)/)[0].match(/\d+/)[0];
  8856.         newItem.date = issdate.match(/,\s+(.*)$/)[1];
  8857.         
  8858.         
  8859.         var axpath = ''//div[@class="article"]/div[@class="entry"]/p[1]/a'';
  8860.         var authors = newDoc.evaluate(axpath, newDoc, null, XPathResult.ANY_TYPE, null);
  8861.         var next_author = authors.iterateNext();
  8862.         while (next_author) {
  8863.             newItem.creators.push(Zotero.Utilities.cleanAuthor(next_author.textContent, "author"));
  8864.             next_author = authors.iterateNext();
  8865.         }
  8866.         
  8867.         newItem.attachments.push({url:newDoc.location.href, title:"Code4Lib Journal Snapshot", mimeType:"text/html"});
  8868.         newItem.complete();
  8869.     }, function() {Zotero.done;});
  8870.     Zotero.wait();
  8871. }');
  8872.  
  8873. REPLACE INTO translators VALUES ('37445f52-64fa-4a2a-9532-35753520a0f0', '1.0.0b4.r5', '', '2008-01-16 06:30:00', '0', '100', '4', 'HeinOnline', 'Michael Berkowitz', 'http://heinonline\.org/HOL/', 
  8874. 'function detectWeb(doc, url) {
  8875.     if (url.indexOf("LuceneSearch") != -1) {
  8876.         return "multiple";
  8877.     } else if (url.indexOf("handle=hein.journals")) {
  8878.         return "journalArticle";
  8879.     }
  8880. }', 
  8881. 'function doWeb(doc, url) {
  8882.     
  8883.     var handle = url.match(/handle=([^&]*)&/)[1];
  8884.     if (url.match(/&id=(\d+)/)) {
  8885.         var id= url.match(/&id=(\d+)/)[1];
  8886.     } else if (url.match(/&div=(\d+)/)) {
  8887.         var ids = new Array();
  8888.         var id = doc.evaluate(''//option[@selected="selected"]/@value'', doc, null, XPathResult.ANY_TYPE, null);
  8889.         var next_id = id.iterateNext();
  8890.         while (next_id) {
  8891.             ids.push(next_id.textContent);
  8892.             next_id = id.iterateNext();
  8893.         }
  8894.         id = ids[ids.length - 1];
  8895.     }
  8896.     
  8897.     var citationurl = ''http://heinonline.org/HOL/citation-info?handle='' + handle + ''&id='' + id;
  8898.     var xpath = ''//div[@id="guide"]/ul/li[3]/a'';
  8899.     var journal = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/([^\d]*)/)[1];
  8900.     
  8901.     var newItem = new Zotero.Item("journalArticle");
  8902.     newItem.publicationTitle = Zotero.Utilities.trimInternal(journal);
  8903.     newItem.repository = "HeinOnline";
  8904.     newItem.url = url;
  8905.     
  8906.     Zotero.Utilities.HTTP.doGet(citationurl, function(text) {
  8907.         var stuff = text.match(/(\d+)\s+([^\d]+)\s+(\d+)\s+\(([-\d]+)\)\s+<br>\s+([^;]+)(;\s*(.*))?/);
  8908.         newItem.volume = stuff[1];
  8909.         newItem.journalAbbreviation = stuff[2];
  8910.         newItem.pages = stuff[3];
  8911.         newItem.date = stuff[4];
  8912.         newItem.title = Zotero.Utilities.trimInternal(stuff[5]);
  8913.         
  8914.         if (stuff[7]) {
  8915.             var authors = stuff[7].split('';'');
  8916.             for (var i in authors) {
  8917.                 authors[i] = authors[i].split('','');
  8918.                 newItem.creators.push({lastName:authors[i][0], firstName:authors[i][1], creatorType:"author"});
  8919.             }
  8920.         }
  8921.         
  8922.         var pdfurl = ''http://heinonline.org/HOL/Print?handle='' + handle + ''&id='' + id;
  8923.         Zotero.Utilities.HTTP.doGet(pdfurl, function(text) {
  8924.             var newurl = text.match(/<a\s+href=\"(PDF[^"]+)\"/i)[1];
  8925.             newItem.attachments = [
  8926.                 {url:url, title:"HeinOnline Snapshot", mimeType:"text/html"},
  8927.                 {url:''http://heinonline.org/HOL/'' + newurl, title:"HeinOnline PDF", mimeType:"application/pdf"}
  8928.             ];
  8929.             newItem.complete();
  8930.         });
  8931.     });
  8932.     Zotero.wait();
  8933. }');
  8934.  
  8935. REPLACE INTO translators VALUES ('dede653d-d1f8-411e-911c-44a0219bbdad', '1.0.0b4.r1', '', '2007-06-18 18:15:00', '0', '100', '4', 'GPO Access e-CFR', 'Bill McKinney', '^http://ecfr\.gpoaccess\.gov/cgi/t/text/text-idx.+', 
  8936. 'function detectWeb(doc, url) {
  8937.     var re = new RegExp("^http://ecfr\.gpoaccess\.gov/cgi/t/text/text-idx");
  8938.     if(re.test(doc.location.href)) {
  8939.         return "book";
  8940.     } else {
  8941.         return "multiple";
  8942.     }
  8943. }', 
  8944. 'function get_nextsibling(n)
  8945.   {
  8946.   var x=n.nextSibling;
  8947.   while (x.nodeType!=1)
  8948.    {
  8949.    x=x.nextSibling;
  8950.    }
  8951.   return x;
  8952. }
  8953. function scrape(doc) {
  8954.  
  8955.     var newItem = new Zotero.Item("statute");
  8956.     newItem.url = doc.location.href;
  8957.     var extraText = new String();
  8958.     var tmpSection = "";
  8959.     newItem.code = "Electronic Code of Federal Regulations";
  8960.     newItem.language = "en-us";
  8961.     
  8962.     var spanTags = doc.getElementsByTagName("span");
  8963.     for(var i=0; i<spanTags.length; i++) {
  8964.         if (spanTags[i].className == "mainheader") {
  8965.             var tmpStr = spanTags[i].innerHTML;
  8966.             tmpStr = tmpStr.replace(/\ /g, " ");
  8967.             tmpStr = tmpStr.replace(/\&\#167;/g, "Sec.");
  8968.             newItem.codeNumber = tmpStr;
  8969.             newItem.title = "e-CFR: " + tmpStr;
  8970.         }
  8971.         if (spanTags[i].className == "div5head") {
  8972.             var tmpStr = spanTags[i].childNodes[0].innerHTML;
  8973.             tmpStr = tmpStr.replace(/\ /g, " ");
  8974.             tmpStr = tmpStr.replace(/\&\#167;/g, "Sec.");
  8975.             tmpSection = tmpStr;
  8976.         }
  8977.     }
  8978.  
  8979.     var heading5Tags = doc.getElementsByTagName("h5");
  8980.     for(var i=0; i<heading5Tags.length; i++) {
  8981.         var tmpStr = heading5Tags[0].innerHTML;
  8982.         tmpStr = tmpStr.replace(/\ /g, " ");
  8983.         tmpStr = tmpStr.replace(/\&\#167;/g, "Sec.");
  8984.         if (tmpSection != "") {
  8985.             tmpSection = tmpSection + " - ";
  8986.         }
  8987.         newItem.section = tmpSection + tmpStr;
  8988.         break;
  8989.     }
  8990.  
  8991.     // statutory source
  8992.     var boldTags = doc.getElementsByTagName("b");
  8993.     for(var i=0; i<boldTags.length; i++) {
  8994.         var s = new String(boldTags[i].innerHTML);
  8995.         if (s.indexOf("Source:") > -1) {
  8996.             newItem.history = "Source: " + boldTags[i].nextSibling.nodeValue;
  8997.         }
  8998.         if (s.indexOf("Authority:") > -1) {
  8999.             newItem.extra = "Authority: " + boldTags[i].nextSibling.nodeValue;
  9000.         }
  9001.     }
  9002.  
  9003.     newItem.complete();
  9004. }
  9005.  
  9006. function doWeb(doc, url) {
  9007.     var re = new RegExp("http://ecfr\.gpoaccess\.gov/cgi/t/text/text-idx.+");
  9008.     if(re.test(doc.location.href)) {
  9009.         scrape(doc);
  9010.     } else {
  9011.         var items = Zotero.Utilities.getItemArray(doc, doc,"http://ecfr\.gpoaccess\.gov/cgi/t/text/text-idx.+");
  9012.         items = Zotero.selectItems(items);
  9013.         
  9014.         if(!items) {
  9015.             return true;
  9016.         }
  9017.         
  9018.         var uris = new Array();
  9019.         for(var i in items) {
  9020.             uris.push(i);
  9021.         }
  9022.         
  9023.         Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) },
  9024.             function() { Zotero.done(); }, null);
  9025.         
  9026.         Zotero.wait();
  9027.     }
  9028. }');
  9029.  
  9030. REPLACE INTO translators VALUES ('5ed5ab01-899f-4a3b-a74c-290fb2a1c9a4', '1.0.0b4.r1', '', '2007-06-18 18:15:00', '0', '100', '4', 'AustLII and NZLII', 'Bill McKinney', 'http:\/\/www\.(?:austlii\.edu\.au|nzlii\.org)\/(?:\/cgi-bin\/disp\.pl\/)?(?:au|nz)\/cases\/.+', 
  9031. 'function detectWeb(doc, url) {
  9032.     var namespace = doc.documentElement.namespaceURI;
  9033.     var nsResolver = namespace ? function(prefix) {
  9034.         if (prefix == ''x'') return namespace; else return null;
  9035.     } : null;
  9036.     
  9037.     var austliiRegexp = /^http:\/\/www\.(?:austlii\.edu\.au|nzlii\.org)\/(?:\/cgi-bin\/disp\.pl\/)?(?:au|nz)\/cases\/.+/
  9038.     if(austliiRegexp.test(url)) {
  9039.         return "book";
  9040.     } else {
  9041.         var aTags = doc.getElementsByTagName("a");
  9042.         for(var i=0; i<aTags.length; i++) {
  9043.             if(articleRegexp.test(aTags[i].href)) {
  9044.                 return "multiple";
  9045.             }
  9046.         }
  9047.     }
  9048. }
  9049. ', 
  9050. 'function scrape(doc) {
  9051.  
  9052.     var namespace = doc.documentElement.namespaceURI;
  9053.     var nsResolver = namespace ? function(prefix) {
  9054.         if (prefix == ''x'') return namespace; else return null;
  9055.     } : null;
  9056.     
  9057.     var newItem = new Zotero.Item("case");
  9058.     newItem.title = doc.title;
  9059.     newItem.url = doc.location.href;
  9060.  
  9061.     var titleRegexp = /^(.+)\s+\[(\d+)\]\s+(\w+)\s(\d+)\s+\((\d+)\s+(\w+)\s+(\d+)\)/
  9062.     var titleMatch = titleRegexp .exec(doc.title);
  9063.     if (titleMatch ) {
  9064.         newItem.caseName = titleMatch[1] + " [" + titleMatch[2] + "] " + titleMatch[3] + " " + titleMatch[4];
  9065.         newItem.dateDecided = titleMatch[7] + " " + titleMatch[6] + " " + titleMatch[5];
  9066.         newItem.court = titleMatch[3];    
  9067.     } else {
  9068.         newItem.caseName = doc.title;
  9069.         newItem.dateDecided = "not found";
  9070.     }
  9071.     
  9072.     newItem.complete();
  9073. }
  9074.  
  9075. function doWeb(doc, url) {
  9076.     var austliiRegexp = /^http:\/\/www\.(?:austlii\.edu\.au|nzlii\.org)\/(?:\/cgi-bin\/disp\.pl\/)?(?:au|nz)\/cases\/.+/
  9077.     if(austliiRegexp.test(url)) {
  9078.         scrape(doc);
  9079.     } else {
  9080.         
  9081.         var items = Zotero.Utilities.getItemArray(doc, doc, austliiRegexp);
  9082.         items = Zotero.selectItems(items);
  9083.         
  9084.         if(!items) {
  9085.             return true;
  9086.         }
  9087.         
  9088.         var urls = new Array();
  9089.         for(var i in items) {
  9090.             urls.push(i);
  9091.         }
  9092.         
  9093.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  9094.         Zotero.wait();
  9095.     }
  9096. }');
  9097.  
  9098. REPLACE INTO translators VALUES ('5ae63913-669a-4792-9f45-e089a37de9ab', '1.0.0b4.r1', '', '2007-06-18 18:15:00', '0', '100', '4', 'BAILII', 'Bill McKinney', 'http:\/\/www\.bailii\.org(?:\/cgi\-bin\/markup\.cgi\?doc\=)?\/\w+\/cases\/.+', 
  9099. 'function detectWeb(doc, url) {
  9100.     var namespace = doc.documentElement.namespaceURI;
  9101.     var nsResolver = namespace ? function(prefix) {
  9102.         if (prefix == ''x'') return namespace; else return null;
  9103.     } : null;
  9104.     
  9105.     var liiRegexp= /^http:\/\/www\.bailii\.org(?:\/cgi\-bin\/markup\.cgi\?doc\=)?\/\w+\/cases\/.+/
  9106.     if(liiRegexp.test(url)) {
  9107.         return "book";
  9108.     } else {
  9109.         var aTags = doc.getElementsByTagName("a");
  9110.         for(var i=0; i<aTags.length; i++) {
  9111.             if(articleRegexp.test(aTags[i].href)) {
  9112.                 return "multiple";
  9113.             }
  9114.         }
  9115.     }
  9116. }', 
  9117. 'function scrape(doc) {
  9118.  
  9119.     var namespace = doc.documentElement.namespaceURI;
  9120.     var nsResolver = namespace ? function(prefix) {
  9121.         if (prefix == ''x'') return namespace; else return null;
  9122.     } : null;
  9123.     
  9124.     var newItem = new Zotero.Item("case");
  9125.     newItem.title = doc.title;
  9126.     newItem.url = doc.location.href;
  9127.  
  9128.     var titleRegexp = /^(.+)\s+\[(\d+)\]\s+(.+)\s+\((\d+)\s+(\w+)\s+(\d+)\)/
  9129.     var titleMatch = titleRegexp .exec(doc.title);
  9130.     if (titleMatch ) {
  9131.         newItem.caseName = titleMatch[1] + " [" + titleMatch[2] + "] " + titleMatch[3];
  9132.         newItem.dateDecided = titleMatch[4] + " " + titleMatch[5] + " " + titleMatch[6];
  9133.     } else {
  9134.         newItem.caseName = doc.title;
  9135.         newItem.dateDecided = "not found";
  9136.     }
  9137.  
  9138.     var courtRegexp = /cases\/([^\/]+)\/([^\/]+)\//
  9139.     var courtMatch = courtRegexp.exec(doc.location.href);
  9140.     if (courtMatch) {
  9141.         var divRegexp = /\w+/
  9142.         var divMatch = divRegexp.exec(courtMatch[2]);
  9143.         if (divMatch) {
  9144.             newItem.court = courtMatch[1] + " (" + courtMatch[2] + ")";
  9145.         } else {
  9146.             newItem.court = courtMatch[1];
  9147.         }
  9148.     } else {
  9149.         newItem.court = "not found";
  9150.     }
  9151.     
  9152.     // judge
  9153.     var panel = doc.getElementsByTagName("PANEL");
  9154.     if (panel.length > 0) {
  9155.         var tmp = panel[0].innerHTML;
  9156.         newItem.creators.push({lastName:tmp, creatorType:"judge", fieldMode:true});
  9157.         
  9158.     }
  9159.     // citation
  9160.     var cite = doc.getElementsByTagName("CITATION");
  9161.     if (cite.length > 0) {
  9162.         var tmpc = cite[0].childNodes[0].innerHTML;
  9163.         newItem.notes.push({note:tmpc});
  9164.     }
  9165.     
  9166.     newItem.complete();
  9167. }
  9168.  
  9169. function doWeb(doc, url) {
  9170.     var liiRegexp= /http:\/\/www\.bailii\.org(?:\/cgi\-bin\/markup\.cgi\?doc\=)?\/\w+\/cases\/.+/
  9171.     if(liiRegexp.test(url)) {
  9172.         scrape(doc);
  9173.     } else {
  9174.         
  9175.         var items = Zotero.Utilities.getItemArray(doc, doc, liiRegexp);
  9176.         items = Zotero.selectItems(items);
  9177.         
  9178.         if(!items) {
  9179.             return true;
  9180.         }
  9181.         
  9182.         var urls = new Array();
  9183.         for(var i in items) {
  9184.             urls.push(i);
  9185.         }
  9186.         
  9187.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  9188.         Zotero.wait();
  9189.     }
  9190. }');
  9191.  
  9192. REPLACE INTO translators VALUES ('84799379-7bc5-4e55-9817-baf297d129fe', '1.0.0b4.r1', '', '2007-06-18 18:15:00', '0', '100', '4', 'CanLII', 'Bill McKinney', 'http:\/\/www\.canlii\.org\/en\/[^\/]+\/[^\/]+\/doc\/.+', 
  9193. 'function detectWeb(doc, url) {
  9194.     var namespace = doc.documentElement.namespaceURI;
  9195.     var nsResolver = namespace ? function(prefix) {
  9196.         if (prefix == ''x'') return namespace; else return null;
  9197.     } : null;
  9198.     
  9199.     var canLiiRegexp = /http:\/\/www\.canlii\.org\/en\/[^\/]+\/[^\/]+\/doc\/.+/
  9200.     if(canLiiRegexp .test(url)) {
  9201.         return "book";
  9202.     } else {
  9203.         var aTags = doc.getElementsByTagName("a");
  9204.         for(var i=0; i<aTags.length; i++) {
  9205.             if(articleRegexp.test(aTags[i].href)) {
  9206.                 return "multiple";
  9207.             }
  9208.         }
  9209.     }
  9210. }
  9211. ', 
  9212. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  9213.     var field = metaTags.namedItem(field);
  9214.     if(field) {
  9215.         newItem[zoteroField] = field.getAttribute("content");
  9216.     }
  9217. }
  9218.  
  9219. function scrape(doc) {
  9220.  
  9221.     var namespace = doc.documentElement.namespaceURI;
  9222.     var nsResolver = namespace ? function(prefix) {
  9223.         if (prefix == ''x'') return namespace; else return null;
  9224.     } : null;
  9225.     
  9226.     var newItem = new Zotero.Item("case");
  9227.     
  9228.     var metaTags = doc.getElementsByTagName("meta");
  9229.     associateMeta(newItem, metaTags, "DC.Title", "title");
  9230.     associateMeta(newItem, metaTags, "DC.Date", "dateDecided");
  9231.     associateMeta(newItem, metaTags, "DC.Language", "language");
  9232.     newItem.url = doc.location.href;
  9233.     
  9234.     var field = metaTags.namedItem("DC.Title");
  9235.     var tmpText = "";
  9236.     if(field) {
  9237.         tmpText = field.getAttribute("content");
  9238.         var capRe = /^(.+),\s+(\d{4})\s+(\w+)\s+(\d+)\s+\(([^\)]+)\)/;
  9239.             var m = capRe.exec(tmpText);
  9240.             if(m) {
  9241.                 
  9242.                 newItem.caseName = m[1]+", "+m[2]+" "+m[3]+" "+m[4];
  9243.                 if (m[3] == ''CanLII'') {
  9244.                     newItem.court = m[5];
  9245.                 } else {
  9246.                     newItem.court = m[3];
  9247.                 }
  9248.                 
  9249.             } else {
  9250.                 newItem.caseName = tmpText;
  9251.                 newItem.court = "not found";
  9252.             }
  9253.     }
  9254.     
  9255.     
  9256.     
  9257.     // attach link to pdf version
  9258.     // NOTE: not working - don''t know why
  9259.     var pdfRe = /^(.+)\.html$/;
  9260.     var pdfMatch = pdfRe.exec(doc.location.href);
  9261.     if (pdfMatch) {
  9262.         var pdfUrl = pdfMatch[1]+".pdf";
  9263.         newItem.attachments = [{url:pdfUrl, title:"PDF version", mimeType:"application/pdf"}];
  9264.     }
  9265.     
  9266.     newItem.complete();
  9267. }
  9268.  
  9269. function doWeb(doc, url) {
  9270.     var canLiiRegexp= /http:\/\/www\.canlii\.org\/en\/[^\/]+\/[^\/]+\/doc\/.+/
  9271.     if(canLiiRegexp.test(url)) {
  9272.         scrape(doc);
  9273.     } else {
  9274.         
  9275.         var items = Zotero.Utilities.getItemArray(doc, doc, canLiiRegexp);
  9276.         items = Zotero.selectItems(items);
  9277.         
  9278.         if(!items) {
  9279.             return true;
  9280.         }
  9281.         
  9282.         var urls = new Array();
  9283.         for(var i in items) {
  9284.             urls.push(i);
  9285.         }
  9286.         
  9287.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  9288.         Zotero.wait();
  9289.     }
  9290. }');
  9291.  
  9292. REPLACE INTO translators VALUES ('930d49bc-44a1-4c22-9dde-aa6f72fb11e5', '1.0.0b4.r1', '', '2007-06-18 18:15:00', '0', '100', '4', 'Cornell LII', 'Bill McKinney', '^http://www\.law\.cornell\.edu/supct/html/.+', 
  9293. 'function detectWeb(doc, url) {
  9294.     var namespace = doc.documentElement.namespaceURI;
  9295.     var nsResolver = namespace ? function(prefix) {
  9296.         if (prefix == ''x'') return namespace; else return null;
  9297.     } : null;
  9298.     
  9299.     var liiRegexp = /http:\/\/www\.law\.cornell\.edu\/supct\/html\/.+/
  9300.     if(liiRegexp.test(url)) {
  9301.         return "book";
  9302.     } else {
  9303.         var aTags = doc.getElementsByTagName("a");
  9304.         for(var i=0; i<aTags.length; i++) {
  9305.             if(articleRegexp.test(aTags[i].href)) {
  9306.                 return "multiple";
  9307.             }
  9308.         }
  9309.     }
  9310. }', 
  9311. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  9312.     var field = metaTags.namedItem(field);
  9313.     if(field) {
  9314.         newItem[zoteroField] = field.getAttribute("content");
  9315.     }
  9316. }
  9317.  
  9318. function scrape(doc) {
  9319.  
  9320.     var caselawCourt = "U.S. Supreme Court";
  9321.     var caselawJurisdiction = "Federal";
  9322.     var caselawSourceReporter = "U.S.";
  9323.     var caselawSourceVolume = "___";
  9324.     var caselawSourceStartPage = "___";
  9325.     var caselawParallelSourceVolume = "___";
  9326.     var caselawParallelSourceStartPage = "___";
  9327.     var caselawParallelSourceReporter = "___";
  9328.     var caselawDecisionYear = "";
  9329.     
  9330.     var newItem = new Zotero.Item("case");
  9331.     newItem.url = doc.location.href;
  9332.     newItem.language = "en-us";
  9333.     newItem.court = "U.S. Supreme Court";
  9334.     newItem.reporter = "U.S.";
  9335.     
  9336.     // LII provides a bunch of meta tags to harvest
  9337.     var metaTags = doc.getElementsByTagName("meta");
  9338.     associateMeta(newItem, metaTags, "CASENAME", "title");
  9339.     associateMeta(newItem, metaTags, "CASENAME", "caseName");
  9340.     //associateMeta(newItem, metaTags, "DOCKET", "caselawDocket");
  9341.     //associateMeta(newItem, metaTags, "PARTY1", "caselawParty1");
  9342.     //associateMeta(newItem, metaTags, "PARTY2", "caselawParty2");
  9343.     //associateMeta(newItem, metaTags, "ARGDATE", "caselawArguedDate");
  9344.     //associateMeta(newItem, metaTags, "DECDATE", "dateDecided");
  9345.     associateMeta(newItem, metaTags, "COURTBELOW", "history");
  9346.     //associateMeta(newItem, metaTags, "ACTION", "caselawCourtAction");
  9347.  
  9348.  
  9349.     var tmpCasename = newItem.caseName;
  9350.     tmpCasename = Zotero.Utilities.capitalizeTitle(tmpCasename.toLowerCase());
  9351.     tmpCasename = tmpCasename.replace("V.", "v.");
  9352.     newItem.caseName = tmpCasename;
  9353.     newItem.shortTitle = tmpCasename;
  9354.     
  9355.     // judge
  9356.     var j = metaTags.namedItem("AUTHOR");
  9357.     if(j) {
  9358.         newItem.creators.push({lastName:j.getAttribute("content"), creatorType:"judge", fieldMode:true});
  9359.     }
  9360.  
  9361.     // group meta tags
  9362.     for(var i=0; i<metaTags.length; i++) {
  9363.         var key = metaTags[i].getAttribute("name");
  9364.         var value = metaTags[i].getAttribute("content");
  9365.         if (key == "GROUP") {
  9366.             newItem.tags.push(value);        
  9367.         }
  9368.     }
  9369.     
  9370.     // parse year out of decision date
  9371.     var decdateField = metaTags.namedItem("DECDATE");
  9372.     if(decdateField ) {
  9373.         var decisionYearRegex = /(\w+)\s+(\d+),\s+(\d+)/
  9374.         var decisionDateMatch = decisionYearRegex.exec(decdateField.getAttribute("content"));
  9375.         var dy;
  9376.         var dm;
  9377.         var dd;
  9378.         if (decisionDateMatch ) {
  9379.             dm = decisionDateMatch[1];
  9380.             dd = decisionDateMatch[2];
  9381.             dy = decisionDateMatch [3];
  9382.             caselawDecisionYear = dy;
  9383.             newItem.dateDecided = dy + " " + dm + " " + dd;
  9384.         }
  9385.     }
  9386.  
  9387.     // create attachment to pdf
  9388.     var dyRegex = /^(.+)\/html\/(.+)(\.Z\w+)\.html$/;
  9389.     var dyMatch = dyRegex.exec(newItem.url);
  9390.     if (dyMatch) {
  9391.         var pdfUrl = dyMatch[1]+"/pdf/"+dyMatch[2]+"P"+dyMatch[3];
  9392.         newItem.attachments.push({url:pdfUrl, title:"PDF version", mimeType:"application/pdf", downloadable:true});
  9393.     }
  9394.  
  9395.     // parse disposition
  9396.     var dis = doc.getElementsByTagName("DISPOSITION");
  9397.     if (dis.length > 0) {
  9398.         var tmpDis = dis[0].innerHTML;
  9399.         tmpDis = tmpDis.replace(/\s+/g, " ");
  9400.         newItem.title = newItem.title + " (" +    tmpDis + ")";    
  9401.         newItem.caseName= newItem.caseName + " (" +    tmpDis + ")";    
  9402.         
  9403.     }
  9404.     
  9405.     
  9406.     // parse citation into parts so that bluebook can be constructed
  9407.     var cite = doc.getElementsByTagName("CASENUMBER");
  9408.     if (cite.length > 0) {
  9409.             var citeRegex = /([0-9]+)\s+U\.S\.\s+([0-9]+)/;
  9410.             var citeMatch = citeRegex.exec(cite[0].innerHTML);
  9411.             if (citeMatch) {
  9412.                 caselawSourceVolume = citeMatch[1];
  9413.                 newItem.reporterVolume = citeMatch[1];
  9414.                 caselawSourceStartPage = citeMatch[2];
  9415.                 newItem.firstPage = citeMatch[2];
  9416.             }
  9417.     }
  9418.     
  9419.     // look for offcite span element
  9420.     var spanTags = doc.getElementsByTagName("span");
  9421.     if (spanTags.length > 0) {
  9422.         for(var i=0; i<spanTags.length; i++) {
  9423.             if(spanTags[i].className == "offcite") {
  9424.                 var citeRegex = /([0-9]+)\s+U\.S\.\s+([0-9]+)/;
  9425.                 var citeMatch = citeRegex.exec(spanTags[i].innerHTML);
  9426.                 if (citeMatch) {
  9427.                     caselawSourceVolume = citeMatch[1];
  9428.                     newItem.reporterVolume = citeMatch[1];
  9429.                     caselawSourceStartPage = citeMatch[2];
  9430.                     newItem.firstPage = citeMatch[2];
  9431.                 }
  9432.                 break;    
  9433.             }
  9434.         }
  9435.     }
  9436.     
  9437.     // bluebook citation    
  9438.     var bbCite = newItem.shortTitle + ", " + 
  9439.         caselawSourceVolume + " " + 
  9440.         caselawSourceReporter + " " + 
  9441.         caselawSourceStartPage;
  9442.     // paralell cite    
  9443.     if (caselawParallelSourceVolume != "___") {
  9444.         bbCite = bbCite + ", " + caselawParallelSourceVolume +
  9445.         " " + caselawParallelSourceReporter + " " +
  9446.         caselawParallelSourceStartPage;
  9447.     }    
  9448.     // jurisdiction and year
  9449.     bbCite = bbCite + " (" + caselawDecisionYear + ")";
  9450.     // closing period
  9451.     bbCite = "Bluebook citation: " + bbCite + ".";
  9452.     newItem.notes.push({note:bbCite});
  9453.     
  9454.     // parse out publication notice
  9455.     var notice = doc.getElementsByTagName("NOTICE");
  9456.     if (notice .length > 0) {
  9457.         var tmpNotice= notice [0].innerHTML;
  9458.         tmpNotice= tmpNotice.replace(/\s+/g, " ");
  9459.         newItem.notes.push({note:tmpNotice});        
  9460.     }
  9461.     
  9462.     newItem.complete();
  9463. }
  9464.  
  9465. function doWeb(doc, url) {
  9466.     var liiRegexp = /http:\/\/www\.law\.cornell\.edu\/supct\/html\/.+/
  9467.     if(liiRegexp.test(url)) {
  9468.         scrape(doc);
  9469.     } else {
  9470.         
  9471.         var items = Zotero.Utilities.getItemArray(doc, doc, liiRegexp);
  9472.         items = Zotero.selectItems(items);
  9473.         
  9474.         if(!items) {
  9475.             return true;
  9476.         }
  9477.         
  9478.         var urls = new Array();
  9479.         for(var i in items) {
  9480.             urls.push(i);
  9481.         }
  9482.         
  9483.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  9484.         Zotero.wait();
  9485.     }
  9486. }');
  9487.  
  9488. REPLACE INTO translators VALUES ('232e24fe-2f68-44fc-9366-ecd45720ee9e', '1.0.0b4.r1', '', '2007-06-21 06:30:00', '0', '100', '4', 'Patents - USPTO', 'Bill McKinney', '^http://patft\.uspto\.gov/netacgi/nph-Parser.+', 
  9489. 'function detectWeb(doc, url) {
  9490.     var re = new RegExp("^http://patft\.uspto\.gov/netacgi/nph-Parser");
  9491.     if(re.test(doc.location.href)) {
  9492.         return "book";
  9493.     } else {
  9494.         return "multiple";
  9495.     }
  9496. }', 
  9497. 'function get_nextsibling(n)
  9498.   {
  9499.   var x=n.nextSibling;
  9500.   while (x.nodeType!=1)
  9501.    {
  9502.    x=x.nextSibling;
  9503.    }
  9504.   return x;
  9505. }
  9506.  
  9507. function scrape(doc) {
  9508.  
  9509.     var newItem = new Zotero.Item("patent");
  9510.     newItem.url = doc.location.href;
  9511.     var extraText = new String();
  9512.     var tmpStr = new String();
  9513.     var tmpRefs = "";
  9514.     var tmpTitle = doc.title;
  9515.     
  9516.     var fontTags = doc.getElementsByTagName("font");
  9517.     for(var i=0; i<fontTags.length; i++) {
  9518.         if (fontTags[i].getAttribute("size") == "+1") {
  9519.             tmpTitle = tmpTitle + " - " + fontTags[i].innerHTML;
  9520.         }
  9521.     }
  9522.     tmpTitle = Zotero.Utilities.cleanString(tmpTitle);
  9523.     tmpTitle = tmpTitle.replace(/<[^>]+>/g, "");
  9524.     newItem.title = tmpTitle;
  9525.     
  9526.     var cellTags = doc.getElementsByTagName("td");
  9527.     for(var i=0; i<cellTags.length; i++) {
  9528.  
  9529.         var s = new String(cellTags[i].innerHTML);
  9530.         if (s.indexOf("United States Patent") > -1) {
  9531.             
  9532.             tmpStr = cellTags[i+1].childNodes[0].innerHTML;
  9533.             tmpStr = tmpStr.replace(/<[^>]+>/gi, "");
  9534.             tmpStr = tmpStr.replace(/,/gi, "");
  9535.             newItem.patentNumber = tmpStr;
  9536.             
  9537.             tmpStr = cellTags[i+3].innerHTML;
  9538.             tmpStr = tmpStr.replace(/<[^>]+>/gi, "");
  9539.             newItem.issueDate = tmpStr;
  9540.             continue;
  9541.         }
  9542.         if (s.indexOf("Assignee") > -1) {
  9543.             tmpStr = cellTags[i+1].innerHTML;
  9544.             tmpStr = tmpStr.replace(/<\/?\w+>/gi, "");
  9545.             newItem.assignee = tmpStr;
  9546.             continue;
  9547.         }
  9548.         if (s.indexOf("Inventors") > -1) {
  9549.             tmpStr = cellTags[i+1].innerHTML;
  9550.             
  9551.             var inventors = tmpStr.split(/<b>,/ig);
  9552.             for (var j=0; j<inventors.length; j++) {
  9553.                 var tmpInventor = inventors[j];
  9554.                 tmpInventor = tmpInventor.replace(/<\/?\w+>/gi, "");
  9555.                 tmpInventor = tmpInventor.replace(/\([^\)]+\)/gi, "");
  9556.                 tmpInventor = tmpInventor.replace(/^\s+/gi, "");
  9557.                 
  9558.                 var names = tmpInventor.split(";");
  9559.                 if (names) {
  9560.                     var lname = names[0];
  9561.                     var fname = names[1];
  9562.                     lname = lname.replace(/^\s+/gi, "");
  9563.                     lname = lname.replace(/\s+$/gi, "");
  9564.                     fname= fname.replace(/^\s+/gi, "");
  9565.                     fname= fname.replace(/\s+$/gi, "");
  9566.                     newItem.creators.push({lastName:lname, firstName:fname, creatorType:"inventor"});
  9567.                 }
  9568.             }
  9569.             continue;
  9570.         }
  9571.         
  9572.         // references
  9573.         if (s.indexOf("<a href=\"/netacgi/nph-Parser?Sect2") > -1) {
  9574.                 tmpRefs = tmpRefs + cellTags[i].childNodes[0].innerHTML + " ";
  9575.         }
  9576.         if (s.indexOf("<a href=\"http://appft1.uspto.gov/netacgi/nph-Parser?TERM1") > -1) {
  9577.                 tmpRefs = tmpRefs + cellTags[i].childNodes[0].innerHTML + " ";
  9578.         }
  9579.     }
  9580.     
  9581.     var centerTags = doc.getElementsByTagName("center");
  9582.     for(var i=0; i<centerTags.length; i++) {
  9583.         var s = new String(centerTags[i].innerHTML);
  9584.         if (s.indexOf("Abstract") > -1) {
  9585.             //newItem.extra = "ok";
  9586.             var el = get_nextsibling(centerTags[i]);
  9587.             newItem.abstractNote = el.innerHTML;
  9588.         }
  9589.     
  9590.     }
  9591.  
  9592.     newItem.references = tmpRefs;
  9593.     newItem.complete();
  9594. }
  9595.  
  9596. function doWeb(doc, url) {
  9597.     var re = new RegExp("^http://patft\.uspto\.gov/netacgi/nph-Parser.+");
  9598.     if(re.test(doc.location.href)) {
  9599.         scrape(doc);
  9600.     } else {
  9601.         var items = Zotero.Utilities.getItemArray(doc, doc, "^http://patft\.uspto\.gov/netacgi/nph-Parser.+");
  9602.         items = Zotero.selectItems(items);
  9603.         
  9604.         if(!items) {
  9605.             return true;
  9606.         }
  9607.         
  9608.         var uris = new Array();
  9609.         for(var i in items) {
  9610.             uris.push(i);
  9611.         }
  9612.         
  9613.         Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) },
  9614.             function() { Zotero.done(); }, null);
  9615.         
  9616.         Zotero.wait();
  9617.     }
  9618. }');
  9619.  
  9620. REPLACE INTO translators VALUES ('3e684d82-73a3-9a34-095f-19b112d88bbf', '1.0.0b3.r1', '', '2007-12-22 21:20:00', '1', '100', '4', 'Google Books', 'Simon Kornblith', '^http://books\.google\.[a-z]+(\.[a-z]+)?/books\?(.*id=.*|.*q=.*)', 
  9621. 'function detectWeb(doc, url) {
  9622.     var re = new RegExp(''^http://books\\.google\\.[a-z]+(\.[a-z]+)?/books\\?id=([^&]+)'', ''i'');
  9623.     if(re.test(doc.location.href)) {
  9624.         return "book";
  9625.     } else {
  9626.         return "multiple";
  9627.     }
  9628. }', 
  9629. 'function doWeb(doc, url) {
  9630.     // get local domain suffix
  9631.     var suffixRe = new RegExp("https?://books\.google\.([^/]+)/");
  9632.     var suffixMatch = suffixRe.exec(url);
  9633.     var suffix = suffixMatch[1];              
  9634.     var uri = doc.location.href;
  9635.     var newUris = new Array();
  9636.     
  9637.     var re = new RegExp(''^http://books\\.google\\.[a-z]+(\.[a-z]+)?/books\\?id=([^&]+)'', ''i'');
  9638.     var m = re.exec(uri);
  9639.     if(m) {
  9640.         newUris.push(''http://books.google.''+suffix+''/books?id=''+m[2]);
  9641.     } else {
  9642.         var items = Zotero.Utilities.getItemArray(doc, doc, ''http://books\\.google\\.'' + suffix + ''/books\\?id=([^&]+)'', ''^(?:All matching pages|About this Book|Table of Contents|Index)'');
  9643.         // Drop " - Page" thing
  9644.         for(var i in items) {
  9645.             items[i] = items[i].replace(/- Page [0-9]+\s*$/, "");
  9646.         }
  9647.         items = Zotero.selectItems(items);
  9648.         
  9649.         if(!items) {
  9650.             return true;
  9651.         }
  9652.         
  9653.         for(var i in items) {
  9654.             var m = re.exec(i);
  9655.             newUris.push(''http://books.google.''+suffix+''/books?id=''+m[2]);
  9656.         }
  9657.     }
  9658.     Zotero.Utilities.processDocuments(newUris, function(newDoc) {
  9659.         var newItem = new Zotero.Item("book");
  9660.         newItem.extra = "";
  9661.         
  9662.         var namespace = newDoc.documentElement.namespaceURI;
  9663.         var nsResolver = namespace ? function(prefix) {
  9664.           if (prefix == ''x'') return namespace; else return null;
  9665.         } : null;
  9666.  
  9667.         var xpath = ''//h2[@class="title"]''
  9668.         var elmt;    
  9669.         if (elmt = newDoc.evaluate(xpath, newDoc, nsResolver,
  9670.                                     XPathResult.ANY_TYPE, null).iterateNext()){
  9671.             var title = Zotero.Utilities.superCleanString(elmt.textContent);
  9672.             newItem.title = title;
  9673.             Zotero.debug("title: " + title);
  9674.         }
  9675.         xpath = ''//div[@class="titlewrap"]/span[@class="addmd"]''
  9676.         if (elmt = newDoc.evaluate(xpath, newDoc, nsResolver,
  9677.                                     XPathResult.ANY_TYPE, null).iterateNext()){
  9678.             var authors = Zotero.Utilities.superCleanString(elmt.textContent);
  9679.             if (authors.substring(0, 3) == "By "){
  9680.                 authors = authors.substring(3);
  9681.             }
  9682.             authors = authors.split(", ");
  9683.             for(j in authors) {
  9684.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j], "author"));
  9685.             }
  9686.         }
  9687.         
  9688.         xpath = ''//table[@id="bibdata"]/tbody/tr'';
  9689.         var elmts = newDoc.evaluate(xpath, newDoc, nsResolver,
  9690.                                     XPathResult.ANY_TYPE, null);
  9691.         while(elmt = elmts.iterateNext()) {
  9692.             var fieldelmt = newDoc.evaluate(''./td[1]//text()'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  9693.             if(fieldelmt) {
  9694.                 field = Zotero.Utilities.superCleanString(fieldelmt.nodeValue);
  9695.                 Zotero.debug("output: " + field);
  9696.                 if(field.substring(0,10) == "Published ") {
  9697.                     newItem.date = field.substring(10);
  9698.                     var publisher = newDoc.evaluate(''..//a'', fieldelmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  9699.                     if (publisher){
  9700.                         publisher =  Zotero.Utilities.superCleanString(publisher.textContent);
  9701.                         newItem.publisher = publisher;
  9702.                     }
  9703.                 } else if(field.substring(0,5) == "ISBN ") {
  9704.                     newItem.ISBN = field.substring(5);
  9705.                 } else if(field.substring(field.length-6) == " pages") {
  9706.                     newItem.pages = field.substring(0, field.length-6);
  9707.                 } else if(field.substring(0,12) == "Contributor ") {
  9708.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(field.substring(12), "contributor"));
  9709.                 }
  9710.             }
  9711.         }        
  9712.         newItem.complete();
  9713.     }, function() { Zotero.done(); }, null);
  9714.     
  9715.     Zotero.wait();
  9716. }');
  9717.  
  9718. REPLACE INTO translators VALUES ('57a00950-f0d1-4b41-b6ba-44ff0fc30289', '1.0.0b3.r1', '', '2007-10-16 22:10:00', '1', '100', '4', 'Google Scholar', 'Simon Kornblith', '^http://scholar\.google\.(?:com|com?\.[a-z]{2}|[a-z]{2})/scholar', 
  9719. 'function detectWeb(doc, url) {
  9720.     return "multiple";
  9721. }', 
  9722. 'var haveEndNoteLinks;
  9723.  
  9724. function scrape(doc) {
  9725.     var nsResolver = doc.createNSResolver(doc.documentElement);
  9726.     
  9727.     var items = new Array();
  9728.     var itemGrabLinks = new Array();
  9729.     var itemGrabLink;
  9730.     var links = new Array();
  9731.     var types = new Array();
  9732.     
  9733.     var itemTypes = new Array();
  9734.     var attachments = new Array();
  9735.     
  9736.     var elmts = doc.evaluate(''//p[@class="g"]'', doc, nsResolver,
  9737.                              XPathResult.ANY_TYPE, null);
  9738.     var elmt;
  9739.     var i=0;
  9740.     Zotero.debug("get elmts");
  9741.     while(elmt = elmts.iterateNext()) {
  9742.         var isCitation = doc.evaluate("./font[1]/b[1]/text()[1]", elmt, nsResolver,
  9743.                                       XPathResult.ANY_TYPE, null).iterateNext();
  9744.                                       
  9745.         // use EndNote links if available
  9746.         if(haveEndNoteLinks) {
  9747.             itemGrabLink = doc.evaluate(''.//a[text() = "Import into EndNote"]'',
  9748.                                            elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); 
  9749.         } else {
  9750.             itemGrabLink = doc.evaluate(''.//a[text() = "Related Articles"]'',
  9751.                                            elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); 
  9752.         }
  9753.             
  9754.             var noLinkRe = /^\[[^\]]+\]$/;
  9755.         
  9756.         if(itemGrabLink) {
  9757.             itemGrabLinks[i] = itemGrabLink.href;
  9758.             if(isCitation && noLinkRe.test(isCitation.textContent)) {
  9759.                 // get titles for [BOOK] or [CITATION] entries
  9760.                 items[i] = Zotero.Utilities.getNodeString(doc, elmt, ''./text()|./b/text()'', nsResolver);
  9761.             } else {
  9762.                 // get titles for articles
  9763.                 var link = doc.evaluate(''.//a'', elmt, nsResolver,
  9764.                                         XPathResult.ANY_TYPE, null).iterateNext();
  9765.                 if(link) {
  9766.                     items[i] = link.textContent;
  9767.                     links[i] = link.href;
  9768.                 }
  9769.             }
  9770.             
  9771.             if(items[i]) {
  9772.             i++;
  9773.             }
  9774.         }
  9775.     }
  9776.     
  9777.     items = Zotero.selectItems(items);
  9778.     
  9779.     if(!items) {
  9780.         if(Zotero.done) Zotero.done(true);
  9781.         return true;
  9782.     }
  9783.     
  9784.     var relatedMatch = /[&?]q=related:([^&]+)/;
  9785.     
  9786.     var urls = new Array();
  9787.     for(var i in items) {
  9788.         // get url
  9789.         if(haveEndNoteLinks) {
  9790.             urls.push(itemGrabLinks[i]);
  9791.         } else {
  9792.             var m = relatedMatch.exec(itemGrabLinks[i]);
  9793.             urls.push("http://scholar.google.com/scholar.ris?hl=en&lr=&q=info:"+m[1]+"&oe=UTF-8&output=citation&oi=citation");
  9794.         }
  9795.         
  9796.         if(links[i]) {
  9797.             attachments.push([{title:"Google Scholar Linked Page", type:"text/html",
  9798.                               url:links[i]}]);
  9799.         } else {
  9800.             attachments.push([]);
  9801.         }
  9802.     }
  9803.     
  9804.     var translator = Zotero.loadTranslator("import");
  9805.     translator.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d");
  9806.     translator.setHandler("itemDone", function(obj, item) {
  9807.         item.attachments = attachments.shift();
  9808.         item.complete();
  9809.     });
  9810.     
  9811.     Zotero.Utilities.HTTP.doGet(urls, function(text) {
  9812.         translator.setString(text);
  9813.         translator.translate();
  9814.     }, function() { Zotero.done() });
  9815. }
  9816.  
  9817. function doWeb(doc, url) {
  9818.     var nsResolver = doc.createNSResolver(doc.documentElement);
  9819.     
  9820.     //SR:Will use preference setting url instead of cookie to get EndNote links (works with ezproxy, doesn''t overwrite other prefs)
  9821.     //doc.cookie = "GSP=ID=deadbeefdeadbeef:IN=ebe89f7e83a8fe75+7e6cc990821af63:CF=3; domain=.scholar.google.com";
  9822.     
  9823.     // determine if we need to reload the page
  9824.     
  9825.     // first check for EndNote links
  9826.     Zotero.debug("get links");
  9827.     haveEndNoteLinks = doc.evaluate(''//a[text() = "Import into EndNote"]'', 
  9828.             doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  9829.     if(!haveEndNoteLinks) {
  9830.             // SR:Commenting out this bit as code for retrieving citations from "Related" links is unreliable and unnecessary
  9831.             //// next check if there are docs with no related articles
  9832.             //if(doc.evaluate(''''//p[@class="g"][not(descendant-or-self::text() = "Related Articles")]'''',
  9833.             //    doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  9834.             
  9835.         // SR:Set preferences to show import links in English and do page reload
  9836.         // (bit of a hack as it overwrites user prefs for language and import link type)
  9837.         url = url.replace (/hl\=[^&]*&?/, "");
  9838.         url = url.replace("scholar?", "scholar_setprefs?hl=en&scis=yes&scisf=3&submit=Save+Preferences&");
  9839.         haveEndNoteLinks = true;
  9840.         Zotero.Utilities.loadDocument(url, scrape);
  9841.         Zotero.wait();
  9842.         return;
  9843.             //}
  9844.     }
  9845.     
  9846.     scrape(doc, url);
  9847.     Zotero.wait();
  9848. }');
  9849.  
  9850. REPLACE INTO translators VALUES ('9c335444-a562-4f88-b291-607e8f46a9bb', '1.0.0b3.r1', '', '2006-12-15 15:11:00', 1, 100, 4, 'Berkeley Library Catalog', 'Simon Kornblith', '^https?://[^/]*berkeley.edu[^/]*/WebZ/(?:html/results.html|FETCH)\?.*sessionid=',
  9851. 'function detectWeb(doc, url) {
  9852.     var resultsRegexp = /\/WebZ\/html\/results.html/i
  9853.     if(resultsRegexp.test(url)) {
  9854.         return "multiple";
  9855.     } else {
  9856.         return "book";
  9857.     }
  9858. }',
  9859. 'function reformURL(url) {
  9860.     return url.replace(/fmtclass=[^&]*/, "")+":fmtclass=marc";
  9861. }
  9862.  
  9863. function doWeb(doc, url) {
  9864.     var resultsRegexp = /\/WebZ\/html\/results.html/i
  9865.     
  9866.     if(resultsRegexp.test(url)) {
  9867.         var items = Zotero.Utilities.getItemArray(doc, doc, "/WebZ/FETCH", "^[0-9]*$");
  9868.         items = Zotero.selectItems(items);
  9869.         
  9870.         if(!items) {
  9871.             return true;
  9872.         }
  9873.         
  9874.         var urls = new Array();
  9875.         for(var i in items) {
  9876.             urls.push(reformURL(i));
  9877.         }
  9878.     } else {
  9879.         var urls = [reformURL(url)];
  9880.     }
  9881.     
  9882.     var translator = Zotero.loadTranslator("import");
  9883.     translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
  9884.     var marc = translator.getTranslatorObject();
  9885.     
  9886.     Zotero.Utilities.processDocuments(urls, function(newDoc) {
  9887.         var uri = newDoc.location.href;
  9888.         
  9889.         var namespace = newDoc.documentElement.namespaceURI;
  9890.         var nsResolver = namespace ? function(prefix) {
  9891.           if (prefix == ''x'') return namespace; else return null;
  9892.         } : null;
  9893.         
  9894.         var elmts = newDoc.evaluate(''//table/tbody/tr[@valign="top"]'',
  9895.                                  newDoc, nsResolver, XPathResult.ANY_TYPE, null);
  9896.         
  9897.         var record = new marc.record();
  9898.         while(elmt = elmts.iterateNext()) {
  9899.             var field = Zotero.Utilities.superCleanString(doc.evaluate(''./TD[1]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue);
  9900.             var value = doc.evaluate(''./TD[2]/text()[1]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  9901.             
  9902.             // remove spacing
  9903.             value = value.replace(/^\s+/, "");
  9904.             value = value.replace(/\s+$/, "");
  9905.             
  9906.             if(field == 0) {
  9907.                 record.leader = "00000"+value;
  9908.             } else {
  9909.                 var ind = value[3]+value[5];
  9910.                 value = Zotero.Utilities.cleanString(value.substr(5)).
  9911.                         replace(/\$([a-z0-9]) /g, marc.subfieldDelimiter+"$1");
  9912.                 if(value[0] != marc.subfieldDelimiter) {
  9913.                     value = marc.subfieldDelimiter+"a"+value;
  9914.                 }
  9915.                 record.addField(field, ind, value);
  9916.             }
  9917.         }
  9918.         
  9919.         var newItem = new Zotero.Item();
  9920.         record.translate(newItem);
  9921.         
  9922.         newItem.repository = "Berkeley Library Catalog";
  9923.         
  9924.         newItem.complete();
  9925.     }, function() { Zotero.done(); }, null);
  9926.     
  9927.     Zotero.wait();
  9928. }');
  9929.  
  9930. REPLACE INTO translators VALUES ('d0b1914a-11f1-4dd7-8557-b32fe8a3dd47', '1.0.0b3.r1', '', '2008-01-09 20:00:00', '1', '100', '4', 'EBSCOhost', 'Simon Kornblith', 'https?://[^/]+/(?:bsi|ehost)/(?:results|detail|folder)', 
  9931. 'function detectWeb(doc, url) {
  9932.     var namespace = doc.documentElement.namespaceURI;
  9933.     var nsResolver = namespace ? function(prefix) {
  9934.         if (prefix == ''x'') return namespace; else return null;
  9935.     } : null;
  9936.     
  9937.     // See if this is a search results or folder results page
  9938.     var searchResult = doc.evaluate(''//ul[@class="result-list" or @class="folder-list"]/li/div[@class="result-list-record" or @class="folder-item"]'', doc, nsResolver,
  9939.                                     XPathResult.ANY_TYPE, null).iterateNext();         
  9940.     if(searchResult) {
  9941.         return "multiple";
  9942.     }
  9943.     
  9944.     var xpath = ''//div[@class="record-display"]/dl[@class="citation-fields"]/dt[text() = "Persistent link to this record:"''
  9945.         +''or text() = "V├¡nculo persistente a este informe:"''
  9946.         +''or text() = "Lien permanent ├á cette donn├⌐e:"''
  9947.         +''or text() = "Permanenter Link zu diesem Datensatz:"''
  9948.         +''or text() = "Link permanente al record:"''
  9949.         +''or text() = "Link permanente para este registro:"''
  9950.         +''or text() = "µ£¼Φ¿ÿΘîäσ¢║σ«ÜΘÇúτ╡É:"''
  9951.         +''or text() = "µ¡ñΦ«░σ╜òτÜäµ░╕Σ╣àΘô╛µÄÑ:"''
  9952.         +''or text() = "πüôπü«πâ¼πé│πâ╝πâëπü╕πü«πâæπâ╝πé╖πé╣πé┐πâ│πâê πâ¬πâ│πé»:"''
  9953.         +''or text() = "δáê∞╜öδô£ δºüφü¼ URL:"''
  9954.         +''or text() = "╨ƒ╨╛╤ü╤é╨╛╤Å╨╜╨╜╨░╤Å ╤ü╤ü╤ï╨╗╨║╨░ ╨╜╨░ ╤ì╤é╤â ╨╖╨░╨┐╨╕╤ü╤î:"''
  9955.         +''or text() = "Bu kayda s├╝rekli ba─ƒlant─▒:"''
  9956.         +''or text() = "╬£╧î╬╜╬╣╬╝╬┐╧é ╧â╧ì╬╜╬┤╬╡╧â╬╝╬┐╧é ╧â╬╡ ╬▒╧à╧ä╧î ╧ä╬┐ ╬▒╧ü╧ç╬╡╬»╬┐:"]'';
  9957.  
  9958.     var persistentLink = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  9959.     if(persistentLink) {
  9960.         return "journalArticle";
  9961.     }
  9962. }', 
  9963. 'var customViewStateMatch = /<input type="hidden" name="__CUSTOMVIEWSTATE" id="__CUSTOMVIEWSTATE" value="([^"]+)" \/>/
  9964. var host;
  9965.  
  9966. function fullEscape(text) {
  9967.     return escape(text).replace(/\//g, "%2F").replace(/\+/g, "%2B");
  9968. }
  9969.  
  9970. /*
  9971.  * given the text of the delivery page, downloads an item
  9972.  */
  9973. function downloadFunction(text) {
  9974.     var postLocation = /<form name="aspnetForm" method="post" action="([^"]+)"/
  9975.     var m = postLocation.exec(text);
  9976.     var deliveryURL = m[1].replace(/&/g, "&");
  9977.     m = customViewStateMatch.exec(text);
  9978.     var downloadString = "__EVENTTARGET=&__EVENTARGUMENT=&__CUSTOMVIEWSTATE="+fullEscape(m[1])+"&__VIEWSTATE=&ctl00%24ctl00%24MainContentArea%24MainContentArea%24ctl00%24btnSubmit=Save&ctl00%24ctl00%24MainContentArea%24MainContentArea%24ctl00%24BibFormat=1&ajax=enabled";
  9979.  
  9980.     Zotero.Utilities.HTTP.doPost(host+"/ehost/"+deliveryURL,
  9981.                                  downloadString, function(text) {    // get marked records as RIS
  9982.         // load translator for RIS
  9983.         var translator = Zotero.loadTranslator("import");
  9984.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  9985.         translator.setString(text);
  9986.         translator.setHandler("itemDone", function(obj, item) {
  9987.             if(item.notes && item.notes[0]) {
  9988.                 item.extra = item.notes[0].note;
  9989.                 
  9990.                 delete item.notes;
  9991.                 item.notes = undefined;
  9992.             }
  9993.             item.complete();
  9994.         });
  9995.         translator.translate();
  9996.         
  9997.         Zotero.done();
  9998.     });
  9999. }
  10000.  
  10001. function doWeb(doc, url) {
  10002.     var namespace = doc.documentElement.namespaceURI;
  10003.     var nsResolver = namespace ? function(prefix) {
  10004.         if (prefix == ''x'') return namespace; else return null;
  10005.     } : null;
  10006.  
  10007.     var hostRe = new RegExp("^(https?://[^/]+)/");
  10008.     var m = hostRe.exec(url);
  10009.     host = m[1];
  10010.                                     
  10011.     var searchResult = doc.evaluate(''//ul[@class="result-list" or @class="folder-list"]/li/div[@class="result-list-record" or @class="folder-item"]'', doc, nsResolver,
  10012.                                     XPathResult.ANY_TYPE, null).iterateNext();                              
  10013.  
  10014.     if(searchResult) {
  10015.         var titles = doc.evaluate(''//div[@class="result-list-record" or @class="folder-item-detail"]/span[@class="medium-font"]/a'',
  10016.                                      doc, nsResolver, XPathResult.ANY_TYPE, null);
  10017.         var title = titles.iterateNext();
  10018.         if (!title){
  10019.             titles = doc.evaluate(''//div[@class="result-list-record" or @class="folder-item-detail"]/a'',
  10020.                                      doc, nsResolver, XPathResult.ANY_TYPE, null);
  10021.         }
  10022.         title = titles.iterateNext();
  10023.         // Go through titles
  10024.         var items = new Object();
  10025.         do {
  10026.             items[title.href] = title.textContent;
  10027.         } while(title = titles.iterateNext());
  10028.         
  10029.         var items = Zotero.selectItems(items);
  10030.         if(!items) {
  10031.             return true;
  10032.         }
  10033.  
  10034.         var uris = new Array();
  10035.         for(var i in items) {
  10036.             uris.push(i);
  10037.         }
  10038.         
  10039.         Zotero.Utilities.processDocuments(uris, function(newDoc){
  10040.             var customViewState = newDoc.evaluate(''//input[@name="__CUSTOMVIEWSTATE"]'', newDoc, nsResolver,
  10041.                                  XPathResult.ANY_TYPE, null).iterateNext();
  10042.             customViewState = fullEscape(customViewState.value);
  10043.             var deliverString = "__EVENTTARGET=ctl00%24ctl00%24MainContentArea%24MainContentArea%24topDeliveryControl%24deliveryButtonControl%24lnkExport&__EVENTARGUMENT=&__CUSTOMVIEWSTATE="+customViewState+"&__VIEWSTATE=&ajax=enabled";
  10044.             Zotero.Utilities.HTTP.doPost(newDoc.location.href, deliverString, downloadFunction);
  10045.         });
  10046.     } else {
  10047.         // get view state for post string        
  10048.         var customViewState = doc.evaluate(''//input[@name="__CUSTOMVIEWSTATE"]'', doc, nsResolver,
  10049.                                  XPathResult.ANY_TYPE, null).iterateNext();
  10050.         customViewState = fullEscape(customViewState.value);
  10051.         var deliverString = "__EVENTTARGET=ctl00%24ctl00%24MainContentArea%24MainContentArea%24topDeliveryControl%24deliveryButtonControl%24lnkExport&__EVENTARGUMENT=&__CUSTOMVIEWSTATE="+customViewState+"&__VIEWSTATE=&ajax=enabled";
  10052.         Zotero.Utilities.HTTP.doPost(url, deliverString, downloadFunction);
  10053.     }
  10054.     Zotero.wait();
  10055. }');
  10056.  
  10057. REPLACE INTO translators VALUES ('ce7a3727-d184-407f-ac12-52837f3361ff', '1.0.0b3.r1', '', '2006-12-12 23:41:00', 1, 100, 4, 'NYTimes.com', 'Simon Kornblith', '^http://(?:query\.nytimes\.com/search/query|(?:select\.|www\.)?nytimes\.com/.)', 
  10058. 'function detectWeb(doc, url) {
  10059.     if(doc.title.substr(0, 30) == "The New York Times: Search for") {
  10060.         var namespace = doc.documentElement.namespaceURI;
  10061.         var nsResolver = namespace ? function(prefix) {
  10062.             if (prefix == ''x'') return namespace; else return null;
  10063.         } : null;
  10064.         
  10065.         var result = doc.evaluate(''//div[@id="srchContent"]'', doc, nsResolver,
  10066.                      XPathResult.ANY_TYPE, null).iterateNext();
  10067.         if(result) {
  10068.             return "multiple";
  10069.         }
  10070.     } else {
  10071.         var metaTags = doc.getElementsByTagName("meta");
  10072.         if(metaTags.namedItem("hdl") && metaTags.namedItem("byl")) {
  10073.             return "newspaperArticle";
  10074.         }
  10075.     }
  10076. }',
  10077. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  10078.     if(metaTags[field]) {
  10079.         newItem[zoteroField] = metaTags[field];
  10080.     }
  10081. }
  10082.  
  10083. function scrape(doc, url) {
  10084.     var newItem = new Zotero.Item("newspaperArticle");
  10085.     newItem.publicationTitle = "The New York Times";
  10086.     newItem.ISSN = "0362-4331";
  10087.     
  10088.     var metaTags = new Object();
  10089.     if(url != undefined) {
  10090.         newItem.url = url;
  10091.         var metaTagRe = /<meta[^>]*>/gi;
  10092.         var nameRe = /name="([^"]+)"/i;
  10093.         var contentRe = /content="([^"]+)"/i;
  10094.         var m = doc.match(metaTagRe);
  10095.         
  10096.         if(!m) {
  10097.             return;
  10098.         }
  10099.         
  10100.         for(var i=0; i<m.length; i++) {
  10101.             var name = nameRe.exec(m[i]);
  10102.             var content = contentRe.exec(m[i]);
  10103.             if(name && content) {
  10104.                 metaTags[name[1]] = content[1];
  10105.             }
  10106.         }
  10107.         
  10108.         if(!metaTags["hdl"]) {
  10109.             return;
  10110.         }
  10111.         
  10112.         newItem.attachments.push({url:url, title:"New York Times Snapshot",
  10113.                                    mimeType:"text/html"});
  10114.     } else {
  10115.         newItem.url = doc.location.href;
  10116.         var metaTagHTML = doc.getElementsByTagName("meta");
  10117.         for(var i=0; i<metaTagHTML.length; i++) {
  10118.             var key = metaTagHTML[i].getAttribute("name");
  10119.             var value = metaTagHTML[i].getAttribute("content");
  10120.             if(key && value) {
  10121.                 metaTags[key] = value;
  10122.             }
  10123.         }
  10124.     
  10125.         newItem.attachments.push({document:doc, title:"New York Times Snapshot"});
  10126.     }
  10127.     
  10128.     associateMeta(newItem, metaTags, "dat", "date");
  10129.     associateMeta(newItem, metaTags, "hdl", "title");
  10130.     associateMeta(newItem, metaTags, "dsk", "section");
  10131.     associateMeta(newItem, metaTags, "articleid", "accessionNumber");
  10132.     
  10133.     if(metaTags["byl"]) {
  10134.         var author = Zotero.Utilities.cleanString(metaTags["byl"]);
  10135.         if(author.substr(0, 3).toLowerCase() == "by ") {
  10136.             author = author.substr(3);
  10137.         }
  10138.         
  10139.         var authors = author.split(" and ");
  10140.         for each(var author in authors) {
  10141.             // fix capitalization
  10142.             var words = author.split(" ");
  10143.             for(var i in words) {
  10144.                 words[i] = words[i][0].toUpperCase()+words[i].substr(1).toLowerCase();
  10145.             }
  10146.             author = words.join(" ");
  10147.             
  10148.             if(words[0] == "The") {
  10149.                 newItem.creators.push({lastName:author, creatorType:"author", fieldMode:true});
  10150.             } else {
  10151.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  10152.             }
  10153.         }
  10154.     }
  10155.     
  10156.     if(metaTags["keywords"]) {
  10157.         var keywords = metaTags["keywords"];
  10158.         newItem.tags = keywords.split(",");
  10159.         for(var i in newItem.tags) {
  10160.             newItem.tags[i] = newItem.tags[i].replace("  ", ", ");
  10161.         }
  10162.     }
  10163.     
  10164.     newItem.complete();
  10165. }
  10166.  
  10167. function doWeb(doc, url) {
  10168.     if(doc.title.substr(0, 30) == "The New York Times: Search for") {
  10169.         var namespace = doc.documentElement.namespaceURI;
  10170.         var nsResolver = namespace ? function(prefix) {
  10171.             if (prefix == ''x'') return namespace; else return null;
  10172.         } : null;
  10173.         
  10174.         var result = doc.evaluate(''//div[@id="srchContent"]'', doc, nsResolver,
  10175.                      XPathResult.ANY_TYPE, null).iterateNext();
  10176.         var items = Zotero.Utilities.getItemArray(doc, result, ''^http://(?:select\.|www\.)nytimes.com/.*\.html$'');
  10177.         items = Zotero.selectItems(items);
  10178.             
  10179.         if(!items) {
  10180.             return true;
  10181.         }
  10182.         
  10183.         var urls = new Array();
  10184.         for(var i in items) {
  10185.             urls.push(i);
  10186.         }
  10187.         
  10188.         Zotero.Utilities.HTTP.doGet(urls, function(text, response, url) { scrape(text, url) }, function() { Zotero.done(); }, null);
  10189.         
  10190.         Zotero.wait();
  10191.     } else {
  10192.         scrape(doc);
  10193.     }
  10194. }');
  10195.  
  10196. REPLACE INTO translators VALUES ('1e6d1529-246f-4429-84e2-1f1b180b250d', '1.0.0b3.r1', '', '2006-12-12 23:41:00', 1, 100, 4, 'The Chronicle of Higher Education', 'Simon Kornblith', '^http://chronicle\.com/', 
  10197. 'function detectWeb(doc, url) {
  10198.     var articleRegexp = /^http:\/\/chronicle\.com\/(?:daily|weekly)\/[^/]+\//
  10199.     if(articleRegexp.test(url)) {
  10200.         if(doc.location.href.indexOf("weekly") != -1) {
  10201.             return "magazineArticle";
  10202.         } else {
  10203.             return "webpage";
  10204.         }
  10205.     } else {
  10206.         var aTags = doc.getElementsByTagName("a");
  10207.         for(var i=0; i<aTags.length; i++) {
  10208.             if(articleRegexp.test(aTags[i].href)) {
  10209.                 return "multiple";
  10210.             }
  10211.         }
  10212.     }
  10213. }',
  10214. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  10215.     if(metaTags.namedItem(field)) {
  10216.         newItem[zoteroField] = Zotero.Utilities.cleanString(metaTags.namedItem(field).getAttribute("content"));
  10217.     }
  10218. }
  10219.  
  10220. function scrape(doc) {
  10221.     if(doc.location.href.indexOf("weekly") != -1) {
  10222.         var newItem = new Zotero.Item("magazineArticle");
  10223.         
  10224.         var namespace = doc.documentElement.namespaceURI;
  10225.         var nsResolver = namespace ? function(prefix) {
  10226.             if (prefix == ''x'') return namespace; else return null;
  10227.         } : null;
  10228.         
  10229.         // go in search of pages
  10230.         var content = doc.evaluate(''/html/body/table[@class="layout"]/tbody/tr[1]/td[@class="content"]'',
  10231.                                    doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  10232.         if(content) {
  10233.             var pagesRegexp = /http:\/\/chronicle.com\nSection: [^\n]+\nVolume [0-9]+, Issue [0-9]+, Pages? ([A-Z0-9\-]+)/;
  10234.             var m = pagesRegexp.exec(content.textContent);
  10235.             if(m) {
  10236.                 newItem.pages = m[1];
  10237.             }
  10238.         }
  10239.     } else {
  10240.         var newItem = new Zotero.Item("webpage");
  10241.     }
  10242.     newItem.publicationTitle = "The Chronicle of Higher Education";
  10243.     newItem.ISSN = "0009-5982";
  10244.     
  10245.     newItem.url = doc.location.href;
  10246.     var metaTags = doc.getElementsByTagName("meta");
  10247.  
  10248.     newItem.attachments.push({document:doc, title:"Chronicle of Higher Education Snapshot"});
  10249.     
  10250.     associateMeta(newItem, metaTags, "published_date", "date");
  10251.     associateMeta(newItem, metaTags, "headline", "title");
  10252.     associateMeta(newItem, metaTags, "section", "section");
  10253.     associateMeta(newItem, metaTags, "volume", "volume");
  10254.     associateMeta(newItem, metaTags, "issue", "issue");
  10255.     
  10256.     if(metaTags.namedItem("byline")) {
  10257.         var author = Zotero.Utilities.cleanString(metaTags.namedItem("byline").getAttribute("content"));
  10258.         if(author.substr(0, 3).toLowerCase() == "by ") {
  10259.             author = author.substr(3);
  10260.         }
  10261.         
  10262.         var authors = author.split(" and ");
  10263.         for each(var author in authors) {
  10264.             // fix capitalization
  10265.             var words = author.split(" ");
  10266.             for(var i in words) {
  10267.                 words[i] = words[i][0].toUpperCase()+words[i].substr(1).toLowerCase();
  10268.             }
  10269.             author = words.join(" ");
  10270.             
  10271.             if(words[0] == "The") {
  10272.                 newItem.creators.push({lastName:author, creatorType:"author", fieldMode:true});
  10273.             } else {
  10274.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  10275.             }
  10276.         }
  10277.     }
  10278.     
  10279.     newItem.complete();
  10280. }
  10281.  
  10282. function doWeb(doc, url) {
  10283.     var articleRegexp = /^http:\/\/chronicle\.com\/(?:daily|weekly)\/[^/]+\//;
  10284.     if(articleRegexp.test(url)) {
  10285.         scrape(doc);
  10286.     } else {
  10287.         var items = Zotero.Utilities.getItemArray(doc, doc, ''^http://chronicle\\.com/(?:daily|weekly)/[^/]+/'');
  10288.         items = Zotero.selectItems(items);
  10289.             
  10290.         if(!items) {
  10291.             return true;
  10292.         }
  10293.         
  10294.         var urls = new Array();
  10295.         for(var i in items) {
  10296.             urls.push(i);
  10297.         }
  10298.         
  10299.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  10300.         Zotero.wait();
  10301.     }
  10302. }');
  10303.  
  10304. REPLACE INTO translators VALUES ('4c164cc8-be7b-4d02-bfbf-37a5622dfd56', '1.0.0b3.r1', '', '2006-12-14 00:40:00', 1, 100, 4, 'The New York Review of Books', 'Simon Kornblith', '^https?://www\.nybooks\.com/', 
  10305. 'function detectWeb(doc, url) {
  10306.     var articleRegexp = /^http:\/\/www\.nybooks\.com\/articles\/[0-9]+\/?/
  10307.     if(articleRegexp.test(url)) {
  10308.         return "journalArticle";
  10309.     } else {
  10310.         var aTags = doc.getElementsByTagName("a");
  10311.         for(var i=0; i<aTags.length; i++) {
  10312.             if(articleRegexp.test(aTags[i].href)) {
  10313.                 return "multiple";
  10314.             }
  10315.         }
  10316.     }
  10317. }',
  10318. 'function associateMeta(newItem, metaTags, field, zoteroField) {
  10319.     if(metaTags.namedItem(field)) {
  10320.         newItem[zoteroField] = Zotero.Utilities.cleanString(metaTags.namedItem(field).getAttribute("content"));
  10321.     }
  10322. }
  10323.  
  10324. function scrape(doc) {
  10325.     var newItem = new Zotero.Item("journalArticle");
  10326.     newItem.publicationTitle = "The New York Review of Books";
  10327.     newItem.ISSN = "0028-7504";
  10328.     
  10329.     var namespace = doc.documentElement.namespaceURI;
  10330.     var nsResolver = namespace ? function(prefix) {
  10331.         if (prefix == ''x'') return namespace; else return null;
  10332.     } : null;
  10333.     
  10334.     newItem.url = doc.location.href;
  10335.     var metaTags = doc.getElementsByTagName("meta");
  10336.  
  10337.     newItem.attachments.push({document:doc, title:"New York Review of Books Snapshot"});
  10338.     
  10339.     associateMeta(newItem, metaTags, "dc.title", "title");
  10340.     
  10341.     var info = doc.evaluate(''//div[@id="center-content"]/h4[@class="date"]'',
  10342.                                 doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  10343.     
  10344.     if(info) {
  10345.         // get date (which is in an a tag)
  10346.         newItem.date = doc.evaluate("./a", info, nsResolver, XPathResult.ANY_TYPE,
  10347.                                    null).iterateNext();
  10348.         if(newItem.date) {
  10349.             newItem.date = newItem.date.textContent;
  10350.         }
  10351.         
  10352.         info = Zotero.Utilities.cleanString(info.textContent);
  10353.         
  10354.         // get volume and issue
  10355.         var infoRe = /Volume ([0-9]+), Number ([0-9]+)/;
  10356.         var m = infoRe.exec(info);
  10357.         if(m) {
  10358.             newItem.volume = m[1];
  10359.             newItem.issue = m[2];
  10360.         }
  10361.     }
  10362.     
  10363.     
  10364.     var authors = doc.evaluate(''//div[@id="center-content"]/h4/a[substring(@href, 1, 9) = "/authors/"]'',
  10365.                                doc, nsResolver, XPathResult.ANY_TYPE, null);
  10366.     
  10367.     
  10368.     var author;
  10369.     while(author = authors.iterateNext()) {
  10370.         newItem.creators.push(Zotero.Utilities.cleanAuthor(author.textContent, "author", false));
  10371.     }
  10372.     
  10373.     newItem.complete();
  10374. }
  10375.  
  10376. function doWeb(doc, url) {
  10377.     var articleRegexp = /^http:\/\/www\.nybooks\.com\/articles\/[0-9]+/
  10378.     if(articleRegexp.test(url)) {
  10379.         scrape(doc);
  10380.     } else {
  10381.         var items = Zotero.Utilities.getItemArray(doc, doc, "^https?://www\\.nybooks\\.com/articles/[0-9]+/?");
  10382.         items = Zotero.selectItems(items);
  10383.             
  10384.         if(!items) {
  10385.             return true;
  10386.         }
  10387.         
  10388.         var urls = new Array();
  10389.         for(var i in items) {
  10390.             urls.push(i);
  10391.         }
  10392.         
  10393.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  10394.         Zotero.wait();
  10395.     }
  10396. }');
  10397.  
  10398. REPLACE INTO translators VALUES ('d1bf1c29-4432-4ada-8893-2e29fc88fd9e', '1.0.0b3.r1', '', '2007-06-21 20:10:00', 1, 100, 4, 'washingtonpost.com', 'Simon Kornblith', '^http://www\.washingtonpost\.com/', 
  10399. 'function detectWeb(doc, url) {
  10400.     var namespace = doc.documentElement.namespaceURI;
  10401.     var nsResolver = namespace ? function(prefix) {
  10402.         if (prefix == ''x'') return namespace; else return null;
  10403.     } : null;
  10404.     
  10405.     // don''t say we can scrape when we can''t; make sure user is logged in
  10406.     var signedIn = doc.evaluate(''//a[text() = "Sign out" or text() = "Sign Out"]'',
  10407.                                doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  10408.     if(!signedIn) {
  10409.         return;
  10410.     }
  10411.     
  10412.     var articleRegexp = /http:\/\/www\.washingtonpost\.com\/wp-dyn\/content\/article\/[0-9]+\/[0-9]+\/[0-9]+\/[^\/]+\.html/
  10413.     if(articleRegexp.test(url)) {
  10414.         return "newspaperArticle";
  10415.     } else {
  10416.         var aTags = doc.getElementsByTagName("a");
  10417.         for(var i=0; i<aTags.length; i++) {
  10418.             if(articleRegexp.test(aTags[i].href)) {
  10419.                 return "multiple";
  10420.             }
  10421.         }
  10422.     }
  10423. }',
  10424. 'function scrape(doc) {
  10425.     var namespace = doc.documentElement.namespaceURI;
  10426.     var nsResolver = namespace ? function(prefix) {
  10427.         if (prefix == ''x'') return namespace; else return null;
  10428.     } : null;
  10429.     
  10430.     var newItem = new Zotero.Item("newspaperArticle");
  10431.     newItem.publicationTitle = "The Washington Post";
  10432.     newItem.ISSN = "0740-5421";
  10433.     
  10434.     newItem.url = doc.location.href;
  10435.     var metaTags = doc.getElementsByTagName("meta");
  10436.     
  10437.     // Elena''s code to grab print version (all pages)
  10438.     snapshotURL=doc.location.href.replace(".html", "_pf.html");
  10439.     newItem.attachments.push({title:"Washington Post Snapshot", mimeType:"text/html", url:snapshotURL, snapshot:true});
  10440.  
  10441.     // grab title from doc title
  10442.     newItem.title = doc.title.replace(" - washingtonpost.com", "");
  10443.     
  10444.     var byline = doc.evaluate(''//div[@id="byline"]'', doc, nsResolver,
  10445.                             XPathResult.ANY_TYPE, null).iterateNext();    
  10446.     // grab authors from byline
  10447.     if(byline) {
  10448.         var authors = byline.textContent.substr(3).split(" and ");
  10449.         for each(var author in authors) {
  10450.             newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  10451.         }
  10452.     }
  10453.     
  10454.     var fonts = doc.evaluate(''//div[@id="article"]/p/font/text()'', doc, nsResolver,
  10455.                             XPathResult.ANY_TYPE, null);
  10456.     var font;
  10457.     while(font = fonts.iterateNext()) {
  10458.         var pageRe = /([^;]+);(?:[\xA0 ]+Pages?[\xA0 ]+([A-Z0-9\-]+))?/
  10459.         // grab pages and date
  10460.         Zotero.debug(Zotero.Utilities.cleanString(font.nodeValue));
  10461.         var m = pageRe.exec(font.nodeValue);
  10462.         if(m) {
  10463.             newItem.date = m[1];
  10464.             newItem.pages = m[2];
  10465.             break;
  10466.         }
  10467.     }
  10468.     
  10469.     // grab tags from meta tag
  10470.     var keywords = doc.getElementsByTagName("meta");
  10471.     if(keywords) {
  10472.         keywords = keywords.namedItem("keywords");
  10473.         if(keywords) {
  10474.             keywords = keywords.getAttribute("content");
  10475.             if(keywords) {
  10476.                 newItem.tags = keywords.split(/, ?/);
  10477.             }
  10478.         }
  10479.     }
  10480.     
  10481.     newItem.complete();
  10482. }
  10483.  
  10484. function doWeb(doc, url) {
  10485.     var articleRegexp = /http:\/\/www\.washingtonpost\.com\/wp-dyn\/content\/article\/[0-9]+\/[0-9]+\/[0-9]+\/[^\/]+\.html/
  10486.     if(articleRegexp.test(url)) {
  10487.         scrape(doc);
  10488.     } else {
  10489.         var items = Zotero.Utilities.getItemArray(doc, doc, articleRegexp);
  10490.         items = Zotero.selectItems(items);
  10491.         
  10492.         if(!items) {
  10493.             return true;
  10494.         }
  10495.         
  10496.         var urls = new Array();
  10497.         for(var i in items) {
  10498.             urls.push(i);
  10499.         }
  10500.         
  10501.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  10502.         Zotero.wait();
  10503.     }
  10504. }');
  10505.  
  10506. REPLACE INTO translators VALUES ('a07bb62a-4d2d-4d43-ba08-d9679a0122f8', '1.0.0b3.r1', '', '2008-01-09 20:00:00', 1, 100, 4, 'ABC-CLIO Serials Web', 'Simon Kornblith', 'https?://[^/]*serials\.abc-clio\.com[^/]*/active/go/ABC-Clio-Serials_v4', 
  10507. 'function detectWeb(doc, url) {
  10508.     var namespace = doc.documentElement.namespaceURI;
  10509.     var nsResolver = namespace ? function(prefix) {
  10510.         if (prefix == ''x'') return namespace; else return null;
  10511.     } : null;
  10512.     
  10513.     var result = doc.evaluate(''//table[@class="rc_main"]'', doc, nsResolver,
  10514.                  XPathResult.ANY_TYPE, null).iterateNext();
  10515.     if(result) {
  10516.         return "multiple";
  10517.     }
  10518. }',
  10519. 'function doWeb(doc, url) {
  10520.     var namespace = doc.documentElement.namespaceURI;
  10521.     var nsResolver = namespace ? function(prefix) {
  10522.         if (prefix == ''x'') return namespace; else return null;
  10523.     } : null;
  10524.     
  10525.     var availableItems = new Array();
  10526.     var availableAttachments = new Array();
  10527.         
  10528.     var elmts = doc.evaluate(''//table[@class="rc_main"]'', doc, nsResolver,
  10529.                              XPathResult.ANY_TYPE, null);
  10530.     var elmt;
  10531.     while(elmt = elmts.iterateNext()) {
  10532.         var title = doc.evaluate(''./tbody/tr/td[b/text() = "Title:"]'',
  10533.                                  elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  10534.         var checkbox = doc.evaluate(''.//input[@type = "checkbox"]'',
  10535.                                  elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();            
  10536.         if(title, checkbox) {
  10537.             checkbox = checkbox.name;
  10538.             availableItems[checkbox] = Zotero.Utilities.cleanString(title.textContent).substr(6);
  10539.             
  10540.             var links = doc.evaluate(''./tbody/tr/td[b/text() = "Fulltext: ["]/a'',
  10541.                                      elmt, nsResolver, XPathResult.ANY_TYPE, null);
  10542.             var link;
  10543.             
  10544.             var attach = new Array();
  10545.             while(link = links.iterateNext()) {
  10546.                 attach.push({url:link.href, title:Zotero.Utilities.cleanString(link.textContent)+" Full Text",
  10547.                              mimeType:"text/html"});
  10548.             }
  10549.             availableAttachments[checkbox] = attach;
  10550.         }
  10551.     }
  10552.     
  10553.     var items = Zotero.selectItems(availableItems);
  10554.     
  10555.     if(!items) {
  10556.         return true;
  10557.     }
  10558.     
  10559.     var postString = "_defaultoperation=Download+Options&research_field=&research_value=&jumpto=";
  10560.     var attachments = new Array();
  10561.     for(var i in availableItems) {
  10562.         postString += "&_checkboxname="+i+(items[i] ? "&"+i+"=1" : "");
  10563.         if(items[i]) {
  10564.             attachments.push(availableAttachments[i]);
  10565.         }
  10566.     }
  10567.     
  10568.     Zotero.Utilities.HTTP.doPost(url, postString, function(text) {
  10569.         Zotero.Utilities.HTTP.doPost(url, "_appname=serials&_defaultoperation=Download+Documents&_formname=download&download_format=citation&download_which=tagged&download_where=ris&mailto=&mailreplyto=&mailsubject=&mailmessage=",
  10570.                                       function(text) {    
  10571.             // get link
  10572.             var linkRe = /<a\s+class="button"\s+href="([^"]+)"\s+id="resource_link"/i;
  10573.             var m = linkRe.exec(text);
  10574.             if(!m) {
  10575.                 throw("regular expression failed!");
  10576.             }            
  10577.             Zotero.Utilities.HTTP.doGet(m[1], function(text) {
  10578.                 // load translator for RIS
  10579.                 var translator = Zotero.loadTranslator("import");
  10580.                 translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  10581.                 translator.setString(text);
  10582.                 translator.setHandler("itemDone", function(obj, item) {
  10583.                     if(item.notes && item.notes[0]) {
  10584.                         item.extra = item.notes[0].note;
  10585.                         
  10586.                         delete item.notes;
  10587.                         item.notes = undefined;
  10588.                     }
  10589.                     
  10590.                     // grab uni data from thesis
  10591.                     if(item.itemType == "thesis") {
  10592.                         var re = /^(.+?) ([0-9]{4})\. ([0-9]+) pp\.(.*)$/;
  10593.                         var m = re.exec(item.extra);
  10594.                         if(m) {
  10595.                             item.publisher = m[1];
  10596.                             item.date = m[2];
  10597.                             item.pages = m[3];
  10598.                             item.extra = m[4];
  10599.                         }
  10600.                     }
  10601.                     
  10602.                     // fix periods
  10603.                     for(var i in item.creators) {
  10604.                         var nameLength = item.creators[i].firstName.length;
  10605.                         
  10606.                         if(item.creators[i].firstName[nameLength-1] == ".") {
  10607.                             item.creators[i].firstName = item.creators[i].firstName.substr(0, nameLength-1);
  10608.                         }
  10609.                     }
  10610.                     for(var i in item.tags) {
  10611.                         var tagLength = item.tags[i].length;
  10612.                         
  10613.                         if(item.tags[i][tagLength-1] == ".") {
  10614.                             item.tags[i] = item.tags[i].substr(0, tagLength-1);
  10615.                         }
  10616.                     }
  10617.                     
  10618.                     // fix title
  10619.                     item.title = Zotero.Utilities.superCleanString(item.title);
  10620.                     
  10621.                     // add attachments
  10622.                     item.attachments = attachments.shift();
  10623.                     
  10624.                     item.complete();
  10625.                 });
  10626.                 translator.translate();
  10627.                 Zotero.done();
  10628.             });
  10629.         });
  10630.     });
  10631.     
  10632.     Zotero.wait();
  10633. }');
  10634.  
  10635. REPLACE INTO translators VALUES ('fa396dd4-7d04-4f99-95e1-93d6f355441d', '1.0.0b3.r1', '', '2006-12-11 18:37:00', 1, 100, 4, 'CiteSeer', 'Simon Kornblith', '^http://(?:citeseer\.ist\.psu\.edu/|citeseer\.csail\.mit\.edu/|citeseer\.ifi\.unizh\.ch/|citeseer\.comp\.nus\.edu\.sg/)', 
  10636. 'function detectWeb(doc, url) {
  10637.     var searchRe = /http:\/\/[^\/]+\/ci?s/;
  10638.     if(searchRe.test(url)) {
  10639.         return "multiple";
  10640.     } else {
  10641.         var namespace = doc.documentElement.namespaceURI;
  10642.         var nsResolver = namespace ? function(prefix) {
  10643.             if (prefix == ''x'') return namespace; else return null;
  10644.         } : null;
  10645.         
  10646.         if(doc.evaluate(''/html/body/span[@class="m"]/pre'', doc, nsResolver,
  10647.                         XPathResult.ANY_TYPE, null).iterateNext()) {
  10648.             return "journalArticle";
  10649.         }
  10650.     }
  10651. }',
  10652. 'function scrape(doc) {
  10653.     var namespace = doc.documentElement.namespaceURI;
  10654.     var nsResolver = namespace ? function(prefix) {
  10655.         if (prefix == ''x'') return namespace; else return null;
  10656.     } : null;
  10657.     
  10658.     // figure out what attachments to add
  10659.     var attachments = new Array();
  10660.     var results = doc.evaluate(''/html/body/span[@class="m"]/table[@class="h"]/tbody/tr/td[4]/center/font/a'',
  10661.                            doc, nsResolver, XPathResult.ANY_TYPE, null);
  10662.     var elmt;
  10663.     
  10664.     var acceptableTypes = ["PDF", "PS", "PS.gz"];
  10665.     var mimeTypes = ["application/pdf", "application/postscript", "application/gzip"];
  10666.     while(elmt = results.iterateNext()) {
  10667.         var kind = elmt.textContent.toString();
  10668.         var index = acceptableTypes.indexOf(kind);
  10669.         if(index != -1) {
  10670.             var attachment = {url:elmt.href, mimeType:mimeTypes[index],
  10671.                               title:"CiteSeer Full Text "+kind};
  10672.             attachments.push(attachment);
  10673.             
  10674.             // only get one of thse files
  10675.             break;
  10676.         }
  10677.     }
  10678.     
  10679.     var bibtex = doc.evaluate(''/html/body/span[@class="m"]/pre/text()'', doc, nsResolver,
  10680.                         XPathResult.ANY_TYPE, null).iterateNext();
  10681.     if(bibtex) {
  10682.         var translator = Zotero.loadTranslator("import");
  10683.         translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4");
  10684.         translator.setString(bibtex.nodeValue.toString());
  10685.         translator.setHandler("itemDone", function(obj, item) {
  10686.             if(item.url) {    // add http to url
  10687.                 item.url = "http://"+item.url;
  10688.             }
  10689.             item.attachments = attachments;
  10690.             
  10691.             item.complete();
  10692.         });
  10693.         translator.translate();
  10694.     } else {
  10695.         throw "No BibTeX found!";
  10696.     }
  10697. }
  10698.  
  10699. function doWeb(doc, url) {
  10700.     var searchRe = /http:\/\/([^\/]+)\/ci?s/;
  10701.     var m = searchRe.exec(doc.location.href);
  10702.     if(m) {
  10703.         var namespace = doc.documentElement.namespaceURI;
  10704.         var nsResolver = namespace ? function(prefix) {
  10705.             if (prefix == ''x'') return namespace; else return null;
  10706.         } : null;
  10707.         
  10708.         var items = Zotero.Utilities.getItemArray(doc, doc, "^http://"+m[1]+"/[^/]+.html");
  10709.         items = Zotero.selectItems(items);
  10710.             
  10711.         if(!items) {
  10712.             return true;
  10713.         }
  10714.         
  10715.         var urls = new Array();
  10716.         for(var i in items) {
  10717.             urls.push(i);
  10718.         }
  10719.         
  10720.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  10721.         Zotero.wait();
  10722.     } else {
  10723.         scrape(doc);
  10724.     }
  10725. }');
  10726.  
  10727. REPLACE INTO translators VALUES ('8917b41c-8527-4ee7-b2dd-bcbc3fa5eabd', '1.0.0b4.r5', '', '2008-02-01 19:30:00', '1', '100', '4', 'CiteULike', 'Sean Takats', 'https?://(?:www\.)?citeulike.org(?:.*/tag/[^/]*$|/search/|/journal/|/group/[0-9]+/library$|/\?page=[0-9]+$|/.*article/[0-9]+$|/$)', 
  10728. 'function detectWeb(doc, url){
  10729.     var articleRe = /\/article\/[0-9]+$/;
  10730.     var m = url.match(articleRe);
  10731.     var newUris = new Array();
  10732.     
  10733.     if (m){
  10734.         return "journalArticle";
  10735.     } else {
  10736.         return "multiple";
  10737.     }
  10738. }', 
  10739. 'function doWeb(doc, url){
  10740.     var articleRe = /\/article\/[0-9]+$/;
  10741.     var m = url.match(articleRe);
  10742.     var newUris = new Array();
  10743.     
  10744.     if (m){
  10745.         newUris.push(url.replace(/citeulike\.org\//, "citeulike.org/endnote/"));
  10746.     } else {
  10747.         var namespace = doc.documentElement.namespaceURI;
  10748.         var nsResolver = namespace ? function(prefix) {
  10749.             if (prefix == ''x'') return namespace; else return null;
  10750.         } : null;
  10751.         var elmt;
  10752.         var elmts = doc.evaluate(''//a[@class="title"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  10753.         var items = new Object();        
  10754.         while(elmt = elmts.iterateNext()) {
  10755.             items[elmt.href] = Zotero.Utilities.trimInternal(elmt.textContent);
  10756.         } 
  10757.         items = Zotero.selectItems(items);
  10758.         if(!items) return true;
  10759.         for(var uri in items) {
  10760.             newUris.push(uri.replace(/citeulike\.org\//, "citeulike.org/endnote/"));
  10761.         }
  10762.     }
  10763.     Zotero.Utilities.HTTP.doGet(newUris, function(text) {
  10764.         var translator = Zotero.loadTranslator("import");
  10765.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  10766.         translator.setString(text);
  10767.         translator.translate();
  10768.         Zotero.done();
  10769.     });
  10770.     Zotero.wait();
  10771. }');
  10772.  
  10773. REPLACE INTO translators VALUES ('ecddda2e-4fc6-4aea-9f17-ef3b56d7377a', '1.0.0b3.r1', '', '2007-12-22 06:00:00', '1', '100', '4', 'arXiv.org', 'Sean Takats', '^http://(?:www\.)?(?:(arxiv\.org|xxx.lanl.gov)/(?:find/\w|list/\w|abs/)|eprintweb.org/S/(?:search|archive|article)(?!.*refs$)(?!.*cited$))', 
  10774. 'function detectWeb(doc, url) {
  10775.     var searchRe = /^http:\/\/(?:www\.)?(?:(arxiv\.org|xxx\.lanl\.gov)\/(?:find|list)|eprintweb.org\/S\/(?:archive|search$))/;
  10776.     if(searchRe.test(url)) {
  10777.         return "multiple";
  10778.     } else {
  10779.         return "journalArticle";
  10780.     }
  10781. }', 
  10782. 'function getPDF(articleID) {
  10783.     return {url:"http://www.arxiv.org/pdf/" + articleID,
  10784.             mimeType:"application/pdf", title:articleID + " PDF"};
  10785. }
  10786.  
  10787. function doWeb(doc, url) {
  10788.     var eprintMultRe = /^http:\/\/(?:www\.)?eprintweb.org\/S\/(?:search|archive)/;
  10789.     var eprintMultM = eprintMultRe.exec(url);
  10790.     
  10791.     var eprintSingRe = /^http:\/\/(?:www\.)?eprintweb.org\/S\/(?:article|search\/[0-9]+\/A[0-9]+)/;
  10792.     var eprintSingM = eprintSingRe.exec(url);
  10793.  
  10794.     if (eprintMultM) {
  10795.         var elmtsXPath = ''//table/tbody/tr/td[@class="txt"]/a[text()="Abstract"]/../b'';
  10796.         var titlesXPath = ''//table/tbody/tr/td[@class="lti"]'';
  10797.         var titleNode = ''./text()'';
  10798.     } else {
  10799.         var elmtsXPath = ''//div[@id="dlpage"]/dl/dt/span[@class="list-identifier"]/a[1]'';
  10800.         var titlesXPath = ''//div[@id="dlpage"]/dl/dd/div[@class="meta"]/div[@class="list-title"]'';
  10801.     }
  10802.  
  10803.     var namespace = doc.documentElement.namespaceURI;
  10804.     var nsResolver = namespace ? function(prefix) {
  10805.         if (prefix == ''x'') return namespace; else return null;
  10806.     } : null;
  10807.  
  10808.     var elmts = doc.evaluate(elmtsXPath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  10809.     var titles = doc.evaluate(titlesXPath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  10810.  
  10811.     var newURIs = new Array();
  10812.     var elmt = elmts.iterateNext();
  10813.     var title = titles.iterateNext();
  10814.     if (elmt && titles) {
  10815.         var availableItems = new Array();
  10816.         var arXivCats = new Array();
  10817.         var arXivIDs = new Array();
  10818.         var i=0;
  10819.         if (eprintMultM){
  10820.             do {
  10821.                 var newID = doc.evaluate(''./text()'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  10822.                 newID = newID.replace(/arXiv:/, "");
  10823.                 newID = newID.replace(/\//g, "%2F"); 
  10824.                 availableItems[i] = doc.evaluate(titleNode, title, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent; 
  10825.                 arXivIDs[i] = newID;
  10826.                 i++;
  10827.             } while ((elmt = elmts.iterateNext()) && (title = titles.iterateNext()));
  10828.         }
  10829.         else{
  10830.             do {
  10831.                 var newID= elmt.textContent;
  10832.                 newID = newID.replace(/arXiv:/, "");
  10833.                 newID = newID.replace(/\//g, "%2F"); 
  10834.                 availableItems[i] = Zotero.Utilities.cleanString(title.textContent); 
  10835.                 arXivIDs[i] = newID;
  10836.                 i++;
  10837.             } while ((elmt = elmts.iterateNext()) && (title = titles.iterateNext()));
  10838.         }
  10839.         var items = Zotero.selectItems(availableItems);
  10840.         if(!items) {
  10841.             return true;
  10842.         }
  10843.         for(var i in items) {
  10844.             newURIs.push("http://export.arxiv.org/oai2?verb=GetRecord&identifier=oai%3AarXiv.org%3A" + arXivIDs[i] + "&metadataPrefix=oai_dc");
  10845.  
  10846.         }
  10847.     }
  10848.     else {
  10849.         if (eprintSingM){
  10850.             var titleID = doc.evaluate(''//td[@class="ti"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  10851.             var arXivID = doc.evaluate(''//table/tbody/tr[4]/td/table/tbody/tr/td[1]/table/tbody/tr[1]/td[@class="txt"]/b'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  10852.             arXivID = arXivID.substring(0, arXivID.indexOf(" "));
  10853.             arXivID = arXivID.replace(/arXiv:/, "");
  10854.             arXivID = arXivID.replace(/\//g, "%2F");
  10855.         } else {
  10856.             var arXivID = doc.evaluate(''//title'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  10857.             var titleRe = /\[([^\]]*)]/;
  10858.             var m = titleRe.exec(arXivID);
  10859.             arXivID = m[1];
  10860.             arXivID = arXivID.replace(/\//g, "%2F"); 
  10861.         }
  10862.         newURIs.push("http://export.arxiv.org/oai2?verb=GetRecord&identifier=oai%3AarXiv.org%3A" + arXivID + "&metadataPrefix=oai_dc");
  10863.  
  10864.     }
  10865.  
  10866.     Zotero.Utilities.HTTP.doGet(newURIs, function(text) {
  10867.         var newItem = new Zotero.Item("journalArticle");
  10868.         //    remove header
  10869.         text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
  10870.         //    fix non-compliant XML tags (colons)
  10871.         text = text.replace(/<dc:/g, "<dc_").replace(/<\/dc:/g, "</dc_");
  10872.         text = text.replace(/<oai_dc:dc/g, "<oai_dc_dc").replace(/<\/oai_dc:dc/g, "</oai_dc_dc");
  10873.         text = text.replace(/<OAI-PMH[^>]*>/, "").replace(/<\/OAI-PMH[^>]*>/, "");
  10874.         text = "<zotero>" + text + "</zotero>";
  10875.         var xml = new XML(text);
  10876.         var title;
  10877.         var citation = xml.GetRecord.record.metadata.oai_dc_dc;
  10878.         var test = xml..responseDate.text().toString();
  10879.  
  10880.         if (citation.dc_title.length()){
  10881.             title = Zotero.Utilities.cleanString(citation.dc_title.text().toString());
  10882.             newItem.title = title;
  10883.         }
  10884.         Zotero.debug("article title: " + title);
  10885.         var type = "";
  10886.         if(citation.dc_creator.length()) {
  10887.         var authors = citation.dc_creator;
  10888.             for(var j=0; j<authors.length(); j++) {
  10889.                 Zotero.debug("author: " + authors[j]);
  10890.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[j].text().toString(),type,true));
  10891.             }
  10892.         }
  10893.         if (citation.dc_date.length()) {
  10894.             var dates = citation.dc_date;
  10895.             newItem.date = Zotero.Utilities.cleanString(dates[0].text().toString());
  10896.         }
  10897.         if (citation.dc_description.length()) {
  10898.             var descriptions = citation.dc_description;
  10899.             for (var j=0; j<descriptions.length(); j++) {
  10900.                 var noteStr = Zotero.Utilities.cleanString(descriptions[j].text().toString());
  10901.                 newItem.notes.push({note:noteStr});
  10902.             }
  10903.         }
  10904.         if (citation.dc_subject.length()) {
  10905.             var subjects = citation.dc_subject;
  10906.             for (var j=0; j<subjects.length(); j++) { 
  10907.                 var subjectValue = Zotero.Utilities.cleanString(subjects[j].text().toString());
  10908.                 newItem.tags.push(subjectValue);
  10909.             }
  10910.         }
  10911.         if (citation.dc_identifier.length()) {
  10912.             var identifiers = citation.dc_identifier;
  10913.             for (var j=0; j<identifiers.length(); j++) {
  10914.                 var identifier = Zotero.Utilities.cleanString(identifiers[j].text().toString());
  10915.                 if (identifier.substr(0, 4) == "doi:") {
  10916.                     newItem.DOI = identifier;
  10917.                 }
  10918.                 else if (identifier.substr(0, 7) == "http://") {
  10919.                     newItem.url = identifier;
  10920.                 }
  10921.                 else {
  10922.                     newItem.extra = identifier;
  10923.                 }
  10924.             }
  10925.         }
  10926.         var articleID = "";
  10927.         if (xml.GetRecord.record.header.identifier.length()) {
  10928.             articleID = xml.GetRecord.record.header.identifier.text().toString();
  10929.             articleID = articleID.substr(14);
  10930.             newItem.publicationTitle = articleID;
  10931.         }
  10932. //        TODO add "arXiv.org" to bib data?
  10933.         newItem.attachments.push(getPDF(articleID));
  10934.         newItem.complete();
  10935.     }, function() {Zotero.done();}, null);
  10936.     Zotero.wait();
  10937. }');
  10938.  
  10939. REPLACE INTO translators VALUES ('232903bc-7307-4058-bb1a-27cfe3e4e655', '1.0.0b3.r1', '', '2007-04-23 17:00:00', '0', '100', '4', 'SPIRES', 'Sean Takats', '^http://www.slac.stanford.edu/spires/find/hep/', 
  10940. 'function detectWeb(doc, url) {
  10941.     var namespace = doc.documentElement.namespaceURI;
  10942.     var nsResolver = namespace ? function(prefix) {
  10943.         if (prefix == ''x'') return namespace; else return null;
  10944.     } : null;
  10945.         
  10946.     var citations = doc.evaluate(''//dl/dd/a[text()="BibTeX"]'', doc, nsResolver,
  10947.             XPathResult.ANY_TYPE, null);
  10948.     var citation = citations.iterateNext();
  10949.     var titles = doc.evaluate(''//p/b[1]'', doc, nsResolver,
  10950.             XPathResult.ANY_TYPE, null);
  10951.     var title = titles.iterateNext();
  10952.     if(citation && title) {
  10953.         // search page
  10954.         return "multiple";
  10955.     }
  10956. }', 
  10957. 'function doWeb(doc, url) {
  10958.     var namespace = doc.documentElement.namespaceURI;
  10959.     var nsResolver = namespace ? function(prefix) {
  10960.         if (prefix == ''x'') return namespace; else return null;
  10961.     } : null;
  10962.         
  10963.     var citations = doc.evaluate(''//dl/dd/a[text()="BibTeX"]'', doc, nsResolver,
  10964.             XPathResult.ANY_TYPE, null);
  10965.     var citation = citations.iterateNext();
  10966. //    var titles = doc.evaluate(''//p/b[1]'', doc, nsResolver,
  10967. //            XPathResult.ANY_TYPE, null);
  10968.     var titles = doc.evaluate(''//p[b[1]]'', doc, nsResolver,
  10969.             XPathResult.ANY_TYPE, null);
  10970.     var title = titles.iterateNext();
  10971.     if(citation && title) {
  10972.         // search page
  10973.         var items = new Object();        
  10974.         do {
  10975.             items[citation.href] = Zotero.Utilities.cleanString(title.textContent);
  10976.         } while((citation=citations.iterateNext()) && (title=titles.iterateNext()))
  10977.         
  10978.         items = Zotero.selectItems(items);
  10979.         if(!items) return true;
  10980.         
  10981.         var newUris = new Array();
  10982.         for(var id in items) {
  10983.             newUris.push(id);
  10984.         }
  10985.     } else {
  10986.         //single result page?
  10987.     }
  10988.     
  10989.     Zotero.Utilities.HTTP.doGet(newUris, function(text) {
  10990.         var m = text.match(/<pre>(?:.|[\r\n])*?<\/pre>/g);
  10991.         var bibTeXString = "";
  10992.         for each(var citation in m) {
  10993.             // kill pre tags
  10994.             citation = citation.substring(5, citation.length-6);
  10995.             bibTeXString += citation;
  10996.         }
  10997.         
  10998.         // import using BibTeX
  10999.         var translator = Zotero.loadTranslator("import");
  11000.         translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4");
  11001.         translator.setString(bibTeXString);
  11002.         translator.setHandler("itemDone", function(obj, item) {            
  11003.             item.complete();
  11004.         });
  11005.         translator.translate();
  11006.         
  11007.         Zotero.done();
  11008.     });
  11009.     Zotero.wait();
  11010. }');
  11011.  
  11012. REPLACE INTO translators VALUES ('fe728bc9-595a-4f03-98fc-766f1d8d0936', '1.0.0b4.r5', '', '2007-12-03 22:00:00', '0', '100', '4', 'Wiley InterScience', 'Sean Takats', 'https?:\/\/(?:www3\.|www\.)?interscience\.wiley\.com[^\/]*\/(?:search\/|cgi-bin\/abstract\/[0-9]+)', 
  11013. 'function detectWeb(doc, url){
  11014.     var namespace = doc.documentElement.namespaceURI;
  11015.     var nsResolver = namespace ? function(prefix) {
  11016.         if (prefix == ''x'') return namespace; else return null;
  11017.     } : null;
  11018.         
  11019.     var xpath = ''//input[@name="ID"][@type="checkbox"]'';
  11020.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  11021.         return "multiple";
  11022.     }
  11023.     var m = url.match(/https?:\/\/[^\/]*\/cgi-bin\/abstract\/[0-9]+/);
  11024.     if (m){
  11025.         return "journalArticle";
  11026.     }
  11027. }', 
  11028. 'function doWeb(doc, url){
  11029.     var namespace = doc.documentElement.namespaceURI;
  11030.     var nsResolver = namespace ? function(prefix) {
  11031.         if (prefix == ''x'') return namespace; else return null;
  11032.     } : null;
  11033.  
  11034.     var m = url.match(/https?:\/\/[^\/]*\/cgi-bin\/abstract\/([0-9]+)/);
  11035.     var ids = new Array();
  11036.     var xpath = ''//tr[td/input[@name="ID"][@type="checkbox"]]'';
  11037.     var elmt;
  11038.     var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null); 
  11039.     elmt = elmts.iterateNext();
  11040.     if(elmt) {  //search
  11041.         var id;
  11042.         var title;
  11043.         var availableItems = new Array();
  11044.         do {
  11045.             title = doc.evaluate(''./td/strong'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  11046.             id = doc.evaluate(''./td/input[@name="ID"][@type="checkbox"]'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  11047.             availableItems[id] = title;
  11048.         } while (elmt = elmts.iterateNext())
  11049.  
  11050.         var items = Zotero.selectItems(availableItems);
  11051.         if(!items) {
  11052.             return true;
  11053.         }
  11054.         for(var id in items) {
  11055.             ids.push(id);
  11056.         }
  11057.         
  11058.     } else if (m){ //single article
  11059.         ids.push(m[1]);
  11060.     }
  11061.     
  11062.     var hostRe = new RegExp("^http(?:s)?://[^/]+");
  11063.     var m = hostRe.exec(doc.location.href);
  11064.     var host = m[0];
  11065.     var uri = host+"/tools/citex";
  11066.     var poststring = "";
  11067.     for each(var id in ids) {
  11068.         poststring = poststring + "&id=" + id;
  11069.     }
  11070.     poststring = "clienttype=1&subtype=1&mode=1&version=1" + poststring;
  11071.     Zotero.Utilities.HTTP.doPost(uri, poststring, function(text) {
  11072.         uri = host+"/tools/CitEx";
  11073.         poststring = "mode=2&format=3&type=2&file=3&exportCitation.x=16&exportCitation.y=10&exportCitation=submit";
  11074.         Zotero.Utilities.HTTP.doPost(uri, poststring, function(text) {
  11075.             var m = text.match(/%A\s(.*)/);  //following lines fix Wiley''s incorrect %A tag (should be separate tags for each author)
  11076.             if (m){
  11077.                 var newauthors ="";
  11078.                 var authors = m[1].split(",")
  11079.                 for each (var author in authors){
  11080.                     if (author != ""){
  11081.                         newauthors = newauthors + "%A "+Zotero.Utilities.trimInternal(author)+"\n";
  11082.                     }
  11083.                 }
  11084.                 text = text.replace(/%A\s.*\n/, newauthors);
  11085.             }
  11086.             var translator = Zotero.loadTranslator("import");
  11087.             translator.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d"); //EndNote/Refer/BibIX
  11088.             translator.setString(text);
  11089.             translator.translate();
  11090.             Zotero.done();
  11091.         });
  11092.     });
  11093.     Zotero.wait();
  11094. }');
  11095.  
  11096. REPLACE INTO translators VALUES ('b6d0a7a-d076-48ae-b2f0-b6de28b194e', '1.0.0b3.r1', '', '2007-04-16 17:00:00', '1', '100', '4', 'ScienceDirect', 'Simon Kornblith', '^https?://www\.sciencedirect\.com[^/]*/science\?(?:.+\&|)_ob=(?:ArticleURL|ArticleListURL|PublicationURL)', 
  11097. 'function detectWeb(doc, url) {
  11098.     var namespace = doc.documentElement.namespaceURI;
  11099.     var nsResolver = namespace ? function(prefix) {
  11100.         if (prefix == ''x'') return namespace; else return null;
  11101.     } : null;
  11102.  
  11103.     if (doc.evaluate(''//img[contains(@src, "guest_user.gif")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  11104.         return false;
  11105.     }
  11106.     if(url.indexOf("_ob=ArticleURL") == -1) {
  11107.         return "multiple";
  11108.     } else {
  11109.         return "journalArticle";
  11110.     }
  11111. }', 
  11112. 'function handleRIS(text, PDFs) {
  11113.     // load translator for RIS
  11114.     var translator = Zotero.loadTranslator("import");
  11115.     translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  11116.     translator.setString(text);
  11117.     translator.setHandler("itemDone", function(obj, item) {
  11118.         if(item.attachments[0]) {
  11119.             item.attachments[0].title = "ScienceDirect Snapshot";
  11120.             item.attachments[0].mimeType = "text/html";
  11121.         }
  11122.  
  11123.         var pdf = PDFs.shift();
  11124.         if(pdf) {
  11125.             item.attachments.push({
  11126.                 title:"ScienceDirect Full Text PDF",
  11127.                 url:pdf, mimeType:"application/pdf"
  11128.             });
  11129.         }
  11130.  
  11131.         if(item.notes[0]) {
  11132.             item.abstractNote = item.notes[0].note;
  11133.             item.notes = new Array();
  11134.         }
  11135.         item.complete();
  11136.     });
  11137.     translator.translate();
  11138.     Zotero.done();
  11139. }
  11140.  
  11141. function doWeb(doc, url) {
  11142.     var namespace = doc.documentElement.namespaceURI;
  11143.     var nsResolver = namespace ? function(prefix) {
  11144.         if (prefix == ''x'') return namespace; else return null;
  11145.     } : null;
  11146.  
  11147.     if(url.indexOf("_ob=ArticleURL") == -1) {
  11148.         // search page
  11149.         var items = new Array();
  11150.         var links = new Array();
  11151.  
  11152.         var isPublication = url.indexOf("_ob=PublicationURL") != -1;
  11153.         if(isPublication) {
  11154.             var xpath = ''//table[@class="txt"][@id="pubBody"]//tr'';
  11155.         } else {
  11156.             var xpath = ''//table[@class="tableResults-T"]//tr'';
  11157.         }
  11158.  
  11159.         var arts = new Object();
  11160.  
  11161.         var tableRows = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  11162.         // Go through table rows
  11163.         var tableRow;
  11164.         var i = 0;
  11165.         while(tableRow = tableRows.iterateNext()) {
  11166.             i++;
  11167.  
  11168.             var checkboxes = tableRow.getElementsByTagName("input");
  11169.             var title = doc.evaluate(''.//span[@class="bf"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  11170.  
  11171.             if(checkboxes[0] && title) {
  11172.                 var index = checkboxes[0].value;
  11173.                 items[index] = Zotero.Utilities.cleanString(title.textContent);
  11174.  
  11175.                 var link = doc.evaluate(''.//a[substring(text(), 1, 3) = "PDF"]'',
  11176.                     tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  11177.                 if(link) {
  11178.                     links[index] = link.href;
  11179.                 }
  11180.             }
  11181.         }
  11182.  
  11183.         items = Zotero.selectItems(items);
  11184.         if(!items) return true;
  11185.  
  11186.         var PDFs = new Array();
  11187.  
  11188.         var itemCount = 0;
  11189.         var itemList = "";
  11190.         for(var i in items) {
  11191.             itemList += "&art="+i;
  11192.             PDFs.push(links[i]);
  11193.             itemCount++;
  11194.         }
  11195.  
  11196.         var count = doc.evaluate(''//input[@name="count"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  11197.  
  11198.         var md5 = doc.getElementsByName("md5")[1].value;
  11199.         if(isPublication) {
  11200.             var tockey = escape(doc.evaluate(''//input[@name="_tockey"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value);
  11201.             var chunk = doc.evaluate(''//input[@name="chunk"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  11202.             var pubType = doc.evaluate(''//input[@name="_pubType"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  11203.             var cdi = url.match(/_cdi=([^&]+)/);
  11204.             var getURL = "http://www.sciencedirect.com/science?_ob=PublicationURL&_method=list&_tockey="+tockey+"&_auth=y&_version=1&refSource=toc&_pubType="+pubType+"&_cdi="+cdi[1]+"&md5="+md5+"&chunk="+chunk+"&view=c&export.x=21&export.y=14&count="+count+itemList;
  11205.         } else {
  11206.             var st = doc.evaluate(''//input[@name="_st"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  11207.             var chunk = doc.evaluate(''//input[@name="_chunk"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  11208.             var count = doc.evaluate(''//input[@name="count"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  11209.             var alid = doc.evaluate(''//input[@name="_ArticleListID"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  11210.             var getURL = "http://www.sciencedirect.com/science?_ob=ArticleListURL&_method=tag&refSource=search&_st="+st+"&count="+count+"&_chunk="+chunk+"&NEXT_LIST=1&view=c&md5="+md5+"&_ArticleListID="+alid+"&export.x=21&export.y=6&sort=d"+itemList;
  11211.         }
  11212.  
  11213.         Zotero.Utilities.HTTP.doGet(getURL, function(text) {
  11214.             var md5 = text.match(/<input type=hidden name=md5 value=([^>]+)>/);
  11215.             var acct = url.match(/_acct=([^&]+)/);
  11216.             var userid = url.match(/_userid=([^&]+)/);
  11217.             var subid = text.match(/<input type=hidden name=_subId value=([^>]+)>/);
  11218.             if(isPublication) {
  11219.                 var post = "_ob=DownloadURL&_method=finish&_acct="+acct[1]+"&_userid="+userid[1]+"&_subId="+subid[1]+"&_tockey="+tockey+"&count="+itemCount+"&md5="+md5[1]+"&JAVASCRIPT_ON=Y&format=cite-abs&citation-type=RIS&x=12&y=15";
  11220.             } else {
  11221.                 var post = "_ob=DownloadURL&_method=finish&_acct="+acct[1]+"&_userid="+userid[1]+"&_ArticleListID="+alid+"&_subId="+subid[1]+"&count="+itemCount+"&md5="+md5[1]+"&JAVASCRIPT_ON=Y&limiter=selected&format=cite-abs&citation-type=RIS";
  11222.             }
  11223.             Zotero.Utilities.HTTP.doPost("http://www.sciencedirect.com/science", post, function(text) { handleRIS(text, PDFs) });
  11224.         });
  11225.     } else {
  11226.         var get = doc.evaluate(''//a[img[contains(@alt, "Export citation")]]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().href;
  11227.  
  11228.         var PDFs = [];
  11229.  
  11230.         var link = doc.evaluate(''//a[substring(text(), 1, 3) = "PDF"]'',
  11231.             doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  11232.         if(link) {
  11233.             var PDFs = [link.href];
  11234.         }
  11235.  
  11236.         Zotero.Utilities.HTTP.doGet(get, function(text) {
  11237.             var md5 = text.match(/<input type=hidden name=md5 value=([^>]+)>/);
  11238.             var acct = url.match(/_acct=([^&]+)/);
  11239.             var userid = url.match(/_userid=([^&]+)/);
  11240.             var alid = url.match(/_alid=([0-9]+)/);
  11241.             var udi = url.match(/_udi=([^&]+)/);
  11242.             var uoikey = text.match(/<input type=hidden name=_uoikey value=([^>]+)>/);
  11243.             if(alid) {
  11244.                 var docIdentifier = "_ArticleListID="+alid[1]+"&_uoikey="+uoikey[1];
  11245.             } else {
  11246.                 var docIdentifier = "_uoikey="+uoikey[1];
  11247.             }
  11248.  
  11249.             var post = "_ob=DownloadURL&_method=finish&_acct="+acct[1]+"&_userid="+userid[1]+"&_docType=FLA&"+docIdentifier+"&md5="+md5[1]+"&JAVASCRIPT_ON=Y&format=cite-abs&citation-type=RIS&x=26&y=17";
  11250.             Zotero.Utilities.HTTP.doPost("http://www.sciencedirect.com/science", post, function(text) { handleRIS(text, PDFs) });
  11251.         });
  11252.     }
  11253.  
  11254.     Zotero.wait();
  11255. }');
  11256.  
  11257. REPLACE INTO translators VALUES ('19643c25-a4b2-480d-91b7-4e0b761fb6ad', '1.0.0b3.r1', '', '2007-03-16 03:00:00', '1', '100', '4', 'ScientificCommons', 'Sean Takats', '^http://(?:en|de|www)\.scientificcommons\.org', 
  11258. 'function detectWeb(doc, url) {
  11259.     var articleRe = /^http:\/\/(?:www|en|de)\.scientificcommons\.org\/([0-9]+)/;
  11260.     var m = articleRe.exec(url);
  11261.  
  11262.     if(m) {
  11263.         return "journalArticle";
  11264.     } else {
  11265.         var frontRe = /^http:\/\/(?:www|en|de)\.scientificcommons\.org\/$/;
  11266.         if(frontRe.test(url)) return "multiple";
  11267.         
  11268.         var namespace = doc.documentElement.namespaceURI;
  11269.         var nsResolver = namespace ? function(prefix) {
  11270.             if (prefix == ''x'') return namespace; else return null;
  11271.             } : null;
  11272.         var listElt = doc.evaluate(''//div[@id="content_search_details"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  11273.         if (listElt) return "multiple";
  11274.     }
  11275.     return false;
  11276. }', 
  11277. 'function doWeb(doc, url) {
  11278.     var namespace = doc.documentElement.namespaceURI;
  11279.     var nsResolver = namespace ? function(prefix) {
  11280.         if (prefix == ''x'') return namespace; else return null;
  11281.         } : null;
  11282.  
  11283.     var hostRe = new RegExp("^(http://[^/]+)/");
  11284.     var m = hostRe.exec(url);
  11285.     var host = m[1];
  11286.  
  11287.     var articleRe = /^http:\/\/(?:www|en|de)\.scientificcommons\.org\/([0-9]+)/;
  11288.     m = articleRe.exec(url);
  11289.     var uris = new Array();
  11290.  
  11291.     if(m) {
  11292.         var idElt = doc.evaluate(''//div[@id="publication_id"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  11293.         if  (idElt) {
  11294.             uris.push(host + "/export/ris/" + idElt.textContent);
  11295.         } else {
  11296.             return false;
  11297.         }
  11298.     } else {
  11299.         var items = new Array();
  11300.         var listElts = doc.evaluate(''//div[@class="content_element"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  11301.         var id;
  11302.         var link;
  11303.         var title;
  11304.         while (listElt = listElts.iterateNext()) {
  11305.             id = doc.evaluate(''./@id'', listElt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  11306.             link = host + "/export/ris/" + id;
  11307.             title = doc.evaluate(''.//p[@class="title"]'', listElt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  11308.             items[link] = Zotero.Utilities.cleanString(title);
  11309.         } 
  11310.  
  11311.         items = Zotero.selectItems(items);
  11312.         if(!items) return true;
  11313.  
  11314.         for(var uri in items) {
  11315.             uris.push(uri);
  11316.         }
  11317.     }
  11318.  
  11319.     Zotero.Utilities.HTTP.doGet(uris, function(text) {
  11320.     // load translator for RIS
  11321.         var translator = Zotero.loadTranslator("import");
  11322.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  11323.         translator.setString(text);
  11324.         translator.setHandler("itemDone", function(obj, item) {
  11325.             // add attachment support?
  11326.             item.complete();
  11327.         });
  11328.         translator.translate();
  11329.         Zotero.done();
  11330.     });
  11331.     Zotero.wait();
  11332. }');
  11333.  
  11334. REPLACE INTO translators VALUES ('d75381ee-7d8d-4a3b-a595-b9190a06f43f', '1.0.0b3.r1', '', '2007-04-05 19:45:00', '0', '100', '4', 'Scitation', 'Eugeniy Mikhailov', '^https?://(?:www\.)?scitation.aip.org', 
  11335. 'function detectWeb(doc, url) {
  11336.     var namespace = doc.documentElement.namespaceURI;
  11337.     var nsResolver = namespace ? function(prefix) {
  11338.         if (prefix == ''x'') return namespace; else return null;
  11339.     } : null;
  11340.  
  11341.     var multids = doc.evaluate(''//tr/td/input[@type="checkbox" and @name="SelectCheck"]'',doc, nsResolver, XPathResult.ANY_TYPE, null);
  11342.     var singid = doc.evaluate(''//input[@type="hidden" and @name="SelectCheck"]'',doc, nsResolver, XPathResult.ANY_TYPE, null);
  11343.  
  11344.     if (multids.iterateNext()){
  11345.         return "multiple";
  11346.     } else if (singid.iterateNext()){
  11347.         return "journalArticle";
  11348.     }
  11349. }', 
  11350. 'function doWeb(doc, url) {
  11351.     var namespace = doc.documentElement.namespaceURI;
  11352.     var nsResolver = namespace ? function(prefix) {
  11353.         if (prefix == ''x'') return namespace; else return null;
  11354.     } : null;
  11355.  
  11356.     var multids = doc.evaluate(''//tr/td/input[@type="checkbox" and @name="SelectCheck"]'',doc, nsResolver, XPathResult.ANY_TYPE, null);
  11357.     var singids = doc.evaluate(''//input[@type="hidden" and @name="SelectCheck"]'',doc, nsResolver, XPathResult.ANY_TYPE, null);
  11358.     var multid;
  11359.     var singid;
  11360.     var getstring = "/getabs/servlet/GetCitation?PrefType=ARTICLE&PrefAction=Add+Selected&fn=open_isi&source=scitation&downloadcitation=+Go+";
  11361.     if (multid = multids.iterateNext()){
  11362.         var titles = new Array();
  11363.         var ids = new Array();
  11364.         var items = new Array();
  11365.         var title;
  11366.         do {
  11367.             title = doc.evaluate(''../..//a[1]'',multid, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  11368.             items[multid.value] = Zotero.Utilities.cleanString(title.textContent);
  11369.         } while (multid =multids.iterateNext());
  11370.         
  11371.         items = Zotero.selectItems(items);
  11372.         if(!items) return true;
  11373.  
  11374.         for(var i in items) {
  11375.             getstring = getstring + "&SelectCheck=" + i;
  11376.         }
  11377.     } else if (singid = singids.iterateNext()){
  11378.         getstring = getstring + "&SelectCheck=" + singid.value;
  11379.     } 
  11380.  
  11381.     var hostRe = new RegExp("^(https?://[^/]+)/");
  11382.     var m = hostRe.exec(url);
  11383.     var host = m[1];
  11384.     var newuri = host + getstring;
  11385.     Zotero.Utilities.HTTP.doGet(newuri, function(text) {
  11386.         // load translator for RIS
  11387.         var translator = Zotero.loadTranslator("import");
  11388.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  11389.         Zotero.debug(text);
  11390.         translator.setString(text);
  11391.         translator.translate();
  11392.  
  11393.         Zotero.done();
  11394.     });
  11395.     Zotero.wait();
  11396. }');
  11397.  
  11398. REPLACE INTO translators VALUES ('2c310a37-a4dd-48d2-82c9-bd29c53c1c76', '1.0.0b3.r1', '', '2007-04-05 19:45:00', '0', '100', '4', 'PROLA', 'Eugeniy Mikhailov', '^https?://(?:www\.)?prola.aps.org/(searchabstract|abstract)/', 
  11399. 'function detectWeb(doc, url) {
  11400.     return "journalArticle";
  11401. }    ', 
  11402. 'function doWeb(doc, url) {
  11403.     var urlRIS = url;
  11404.     // so far several more or less  identical url possible
  11405.     // one is with "abstract" other with "searchabstract"
  11406.     urlRIS = urlRIS.replace("searchabstract","export");
  11407.     urlRIS = urlRIS.replace("abstract","export");
  11408.     var post = "type=ris";
  11409.     
  11410.     Zotero.Utilities.HTTP.doPost(urlRIS, post, function(text) {
  11411.         // load translator for RIS
  11412.         var translator = Zotero.loadTranslator("import");
  11413.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  11414.         Zotero.debug(text);
  11415.         translator.setString(text);
  11416.         translator.translate();
  11417.  
  11418.         Zotero.done();
  11419.      });
  11420.     Zotero.wait();
  11421. }');
  11422.  
  11423. REPLACE INTO translators VALUES ('cde4428-5434-437f-9cd9-2281d14dbf9', '1.0.0b3.r1', '', '2008-01-29 19:00:00', '1', '100', '4', 'Ovid', 'Simon Kornblith and Michael Berkowitz', '/(gw2|spa)/ovidweb\.cgi', 
  11424. 'function detectWeb(doc, url) {
  11425.     var namespace = doc.documentElement.namespaceURI;
  11426.     var nsResolver = namespace ? function(prefix) {
  11427.         if (prefix == ''x'') return namespace; else return null;
  11428.     } : null;
  11429.     
  11430.     var results = doc.evaluate(''//div[@class="bibheader-resultsrange"]/b'', doc, nsResolver,
  11431.         XPathResult.ANY_TYPE, null).iterateNext();
  11432.     
  11433.     if(results) {
  11434.         results = Zotero.Utilities.cleanString(results.textContent);
  11435.         
  11436.         if(results.indexOf("-") != -1) {
  11437.             return "multiple";
  11438.         } else {
  11439.             return "journalArticle";
  11440.         }
  11441.     }
  11442.     
  11443.     return false;
  11444. }', 
  11445. 'function senCase(string) {
  11446.     var words = string.split(/\b/);
  11447.     for (var i = 0 ; i < words.length ; i++) {
  11448.         if (words[i].match(/[A-Z]/)) {
  11449.             words[i] = words[i][0] + words[i].substring(1).toLowerCase();
  11450.         } 
  11451.     }
  11452.     return words.join("");
  11453. }
  11454.  
  11455. function doWeb(doc, url) {
  11456.     var namespace = doc.documentElement.namespaceURI;
  11457.     var nsResolver = namespace ? function(prefix) {
  11458.         if (prefix == ''x'') return namespace; else return null;
  11459.     } : null;
  11460.     
  11461.     var results = Zotero.Utilities.cleanString(doc.evaluate(''//div[@class="bibheader-resultsrange"]/b'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11462.     var post = "S="+doc.evaluate(''.//input[@name="S"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  11463.  
  11464.     if(results.indexOf("-") != -1) {
  11465.         var items = new Object();
  11466.         
  11467.         // Go through table rows
  11468.         if (doc.evaluate(''/html/body/form/div[substring(@class, 1, 10)="titles-row"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  11469.             var tableRows = doc.evaluate(''/html/body/form/div[substring(@class, 1, 10)="titles-row"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  11470.         } else if (doc.evaluate(''//div[@id="titles-records"]/table[@class="titles-row"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  11471.             var tableRows = doc.evaluate(''//div[@id="titles-records"]/table[@class="titles-row"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  11472.         }
  11473.         var tableRow;
  11474.         while(tableRow = tableRows.iterateNext()) {
  11475.             var id = doc.evaluate(''.//input[@name="R"]'', tableRow, nsResolver, XPathResult.ANY_TYPE,
  11476.                 null).iterateNext().value;
  11477.             items[id] = Zotero.Utilities.cleanString(doc.evaluate(''.//span[@class="titles-title"]'', tableRow,
  11478.                 nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11479.         }
  11480.         
  11481.         var items = Zotero.selectItems(items);
  11482.         if(!items) return true;
  11483.         
  11484.         for(var i in items) {
  11485.             post += "&R="+i;
  11486.         }
  11487.     } else {
  11488.         var id = doc.evaluate(''.//input[@name="R"]'', doc, nsResolver, XPathResult.ANY_TYPE,
  11489.             null).iterateNext().value;
  11490.         post += "&R="+id;
  11491.     }
  11492.     
  11493.     post += "&SELECT="+doc.evaluate(''.//input[@name="SELECT"]'', doc, nsResolver, XPathResult.ANY_TYPE,
  11494.         null).iterateNext().value;
  11495.     post += "&CitMan="+doc.evaluate(''.//input[@name="CitMan"]'', doc, nsResolver, XPathResult.ANY_TYPE,
  11496.         null).iterateNext().value;
  11497.     post += "&CitManPrev="+doc.evaluate(''.//input[@name="CitManPrev"]'', doc, nsResolver, XPathResult.ANY_TYPE,
  11498.         null).iterateNext().value;
  11499.     post += "&cmRecordSelect=SELECTED&cmFields=ALL&cmFormat=export&cmsave.x=12&cmsave.y=7";
  11500.         
  11501.     Zotero.Utilities.HTTP.doPost(url, post, function(text) {
  11502.         var lines = text.split("\n");
  11503.         var haveStarted = false;
  11504.         var newItemRe = /^<[0-9]+>/;
  11505.         
  11506.         var newItem = new Zotero.Item("journalArticle");
  11507.         
  11508.         for(var i in lines) {
  11509.             if(lines[i].substring(0,3) == "<1>") {
  11510.                 haveStarted = true;
  11511.             } else if(newItemRe.test(lines[i])) {
  11512.                 newItem.complete();
  11513.                 
  11514.                 newItem = new Zotero.Item("journalArticle");
  11515.             } else if(lines[i].substr(2, 4) == "  - " && haveStarted) {
  11516.                 var fieldCode = lines[i].substr(0, 2);
  11517.                 var fieldContent = Zotero.Utilities.cleanString(lines[i].substr(6));
  11518.                 
  11519.                 if(fieldCode == "TI") {
  11520.                     newItem.title = fieldContent.replace(/\. \[\w+\]$/, "");
  11521.                 } else if(fieldCode == "AU") {
  11522.                     var names = fieldContent.split(", ");
  11523.                     
  11524.                     if(names.length >= 2) {
  11525.                         // get rid of the weird field codes
  11526.                         if(names.length == 2) {
  11527.                             names[1] = names[1].replace(/ [\+\*\S\[\]]+$/, "");
  11528.                         }
  11529.                         names[1] = names[1].replace(/ (?:MD|PhD|[BM]Sc|[BM]A|MPH|MB)$/i, "");
  11530.                         
  11531.                         newItem.creators.push({firstName:names[1], lastName:names[0], creatorType:"author"});
  11532.                     } else {
  11533.                         newItem.creators.push({lastName:names[0], isInstitution:true, creatorType:"author"});
  11534.                     }
  11535.                 } else if(fieldCode == "SO") {
  11536.                     var m = fieldContent.split(".");
  11537.                     newItem.publicationTitle = Zotero.Utilities.cleanString(m[0]);
  11538.                     if (m[1].match(/\d+\(\d+\)/)) {
  11539.                         var n = m[1].match(/(\d+)\((\d+)\)/);
  11540.                         Zotero.debug(n);
  11541.                         newItem.volume = n[1];
  11542.                         newItem.issue = n[2];
  11543.                     } else {
  11544.                         newItem.volume = m[1].match(/\d+/)[0];
  11545.                     }
  11546.                     newItem.date = senCase(Zotero.Utilities.cleanString(m[2]));
  11547.                     newItem.pages = Zotero.Utilities.cleanString(m[3]);
  11548.                 } else if(fieldCode == "SB") {
  11549.                     newItem.tags.push(Zotero.Utilities.superCleanString(fieldContent));
  11550.                 } else if(fieldCode == "KW") {
  11551.                     newItem.tags.push(fieldContent.split(/; +/));
  11552.                 } else if(fieldCode == "DB") {
  11553.                     newItem.repository = "Ovid ("+fieldContent+")";
  11554.                 } else if(fieldCode == "DI") {
  11555.                     newItem.DOI = fieldContent;
  11556.                 } else if(fieldCode == "AB") {
  11557.                     newItem.abstractNote = fieldContent;
  11558.                 }
  11559.             }
  11560.         }
  11561.         
  11562.         // last item is complete
  11563.         if(haveStarted) {
  11564.             newItem.complete();
  11565.         }
  11566.     });
  11567.     Zotero.wait();
  11568. }');
  11569.  
  11570. REPLACE INTO translators VALUES ('cb48083-4d9-4ed-ac95-2e93dceea0ec', '1.0.0b3.r1', '', '2007-11-27 03:00:00', '1', '100', '4', 'Blackwell Synergy', 'Simon Kornblith', '^https?://www\.blackwell-synergy\.com[^/]*/(?:action/doSearch|doi/|links/doi/)', 
  11571. 'function detectWeb(doc, url) {
  11572.     if(url.indexOf("doSearch") != -1) {
  11573.         return "multiple";
  11574.     } else {
  11575.         return "journalArticle";
  11576.     }
  11577. }', 
  11578. 'function doWeb(doc, url) {
  11579.     var namespace = doc.documentElement.namespaceURI;
  11580.     var nsResolver = namespace ? function(prefix) {
  11581.         if (prefix == ''x'') return namespace; else return null;
  11582.     } : null;
  11583.     
  11584.     var post = "";
  11585.     
  11586.     var fulltext = new Object();
  11587.     
  11588.     if(url.indexOf("doSearch") != -1) {
  11589.         var items = new Array();
  11590.         var links = new Array();
  11591.         
  11592.         var tableRows = doc.evaluate(''//div[@class="toc_item"]'', doc,
  11593.             nsResolver, XPathResult.ANY_TYPE, null);
  11594.         var tableRow;
  11595.         // Go through table rows
  11596.         while(tableRow = tableRows.iterateNext()) {
  11597.             var id = doc.evaluate(''.//input[@name="doi"]'', tableRow, nsResolver, XPathResult.ANY_TYPE,
  11598.                 null).iterateNext().value;
  11599.             items[id] = Zotero.Utilities.cleanString(doc.evaluate(''.//label'', tableRow,
  11600.                 nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11601.         }
  11602.         
  11603.         var items = Zotero.selectItems(items);
  11604.         if(!items) return true;
  11605.         
  11606.         // find all fulltext links so we can determine where we can scrape the fulltext article
  11607.         var fulltextLinks = doc.evaluate(''//a[img[@alt="Full Text Article"]]'', doc,
  11608.             nsResolver, XPathResult.ANY_TYPE, null);
  11609.         var fulltextLink;
  11610.         while(fulltextLink = fulltextLinks.iterateNext()) {
  11611.             links.push(fulltextLink.href.toString());
  11612.         }
  11613.         
  11614.         for(var i in items) {
  11615.             post += "doi="+encodeURIComponent(i)+"&";
  11616.             
  11617.             // check for fulltext links
  11618.             for each(var link in links) {
  11619.                 if(link.indexOf(i) != -1) {
  11620.                     fulltext[i] = true;
  11621.                     break;
  11622.                 }
  11623.             }
  11624.         }
  11625.     } else {
  11626.         var m = url.match(/https?:\/\/[^\/]+\/doi\/[^\/]+\/([^\?]+)(\?|$)/);
  11627.         if (m) {
  11628.             var doi = m[1];
  11629.         } else {
  11630.             m = url.match(/https?:\/\/[^\/]+\/links\/doi\/([^\?]+)(\?|$)/);
  11631.             var doi = m[1];
  11632.         }
  11633.         post += "doi="+encodeURIComponent(doi)+"&";
  11634.         
  11635.         if(url.indexOf("doi/full") != -1 ||
  11636.           doc.evaluate(''//img[@alt="Full Text Article"]'', doc, nsResolver, XPathResult.ANY_TYPE,
  11637.           null).iterateNext()) {
  11638.             fulltext[doi] = true;
  11639.         }
  11640.     }
  11641.     
  11642.     post += "include=abs&format=refman&direct=on&submit=Download+references";
  11643.     
  11644.     Zotero.Utilities.HTTP.doPost("http://www.blackwell-synergy.com/action/downloadCitation", post, function(text) {
  11645.         // load translator for RIS
  11646.         var translator = Zotero.loadTranslator("import");
  11647.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  11648.         translator.setString(text);
  11649.         translator.setHandler("itemDone", function(obj, item) {
  11650.             item.attachments = [
  11651.                 {url:item.url, title:"Blackwell Synergy Snapshot", mimeType:"text/html"},
  11652.                 {url:item.url.replace("/doi/abs", "/doi/pdf"), title:"Blackwell Synergy Full Text PDF", mimeType:"application/pdf"}
  11653.             ];
  11654.             // use fulltext if possible
  11655.             if(fulltext[item.DOI.substr(4)]) {
  11656.                 item.attachments[0].url = item.attachments[0].url.replace("/doi/abs", "/doi/full");
  11657.             }
  11658.             
  11659.             item.complete();
  11660.         });
  11661.         translator.translate();
  11662.         
  11663.         Zotero.done();
  11664.     });
  11665.         
  11666.     Zotero.wait();
  11667. }');
  11668.  
  11669. REPLACE INTO translators VALUES ('df966c80-c199-4329-ab02-fa410c8eb6dc', '1.0.0b3.r1', '', '2008-01-23 20:00:00', '1', '100', '4', 'University of Chicago', 'Sean Takats', 'https?://[^/]*journals\.uchicago\.edu[^/]*/(?:doi/abs|doi/full|toc)', 
  11670. 'function detectWeb(doc, url) {
  11671.     if(url.indexOf("toc") != -1) {
  11672.         return "multiple";
  11673.     } else {
  11674.         return "journalArticle";
  11675.     }
  11676. }', 
  11677. 'function doWeb(doc, url) {
  11678.     var namespace = doc.documentElement.namespaceURI;
  11679.     var nsResolver = namespace ? function(prefix) {
  11680.         if (prefix == ''x'') return namespace; else return null;
  11681.     } : null;
  11682.     
  11683.     var post = "";
  11684.     
  11685.     var fulltext = new Object();
  11686.     
  11687.     if(url.indexOf("toc") != -1) {
  11688.         var items = new Array();
  11689.         var links = new Array();
  11690.         
  11691.         var tableRows = doc.evaluate(''//li[div[@class="articleListing_col3"]/label][//input[@name="doi"]]'', doc,
  11692.             nsResolver, XPathResult.ANY_TYPE, null);
  11693.         var tableRow;
  11694.         // Go through table rows
  11695.         while(tableRow = tableRows.iterateNext()) {
  11696.             var id = doc.evaluate(''.//input[@name="doi"]'', tableRow, nsResolver, XPathResult.ANY_TYPE,
  11697.                 null).iterateNext().value;
  11698.             items[id] = Zotero.Utilities.trimInternal(doc.evaluate(''.//label'', tableRow,
  11699.                 nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent);
  11700.         }
  11701.         
  11702.         var items = Zotero.selectItems(items);
  11703.         if(!items) return true;
  11704.         
  11705.         // find all fulltext links so we can determine where we can scrape the fulltext article
  11706.         var fulltextLinks = doc.evaluate(''//a[starts-with(text(), "Full Text")]'', doc,
  11707.             nsResolver, XPathResult.ANY_TYPE, null);
  11708.         var fulltextLink;
  11709.         while(fulltextLink = fulltextLinks.iterateNext()) {
  11710.             links.push(fulltextLink.href.toString());
  11711.         }
  11712.         
  11713.         for(var i in items) {
  11714.             post += "doi="+encodeURIComponent(i)+"&";
  11715.             
  11716.             // check for fulltext links
  11717.             for each(var link in links) {
  11718.                 if(link.indexOf(i) != -1) {
  11719.                     fulltext[i] = true;
  11720.                     break;
  11721.                 }
  11722.             }
  11723.         }
  11724.     } else {
  11725.         var m = url.match(/https?:\/\/[^\/]+\/doi\/[^\/]+\/([^\?]+)(\?|$)/);
  11726.         if (m) {
  11727.             var doi = m[1];
  11728.         } else {
  11729.             m = url.match(/https?:\/\/[^\/]+\/links\/doi\/([^\?]+)(\?|$)/);
  11730.             var doi = m[1];
  11731.         }
  11732.         post += "doi="+encodeURIComponent(doi)+"&";
  11733.         
  11734.         if(url.indexOf("doi/full") != -1 ||
  11735.           doc.evaluate(''//img[@alt="Full Text Article"]'', doc, nsResolver, XPathResult.ANY_TYPE,
  11736.           null).iterateNext()) {
  11737.             fulltext[doi] = true;
  11738.         }
  11739.     }
  11740.     
  11741.     post += "include=cit&downloadFileName=deadbeef&format=refman&direct=on&submit=Download+article+citation+data";
  11742.     
  11743.     Zotero.Utilities.HTTP.doPost("http://www.journals.uchicago.edu/action/downloadCitation", post, function(text) {
  11744.         // load translator for RIS
  11745.         var translator = Zotero.loadTranslator("import");
  11746.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  11747.         translator.setString(text);
  11748.         translator.setHandler("itemDone", function(obj, item) {
  11749.             item.attachments = [
  11750.                 {url:item.url, title:"University of Chicago Journals Snapshot", mimeType:"text/html"},
  11751.                 {url:item.url.replace("/doi/abs", "/doi/pdf"), title:"University of Chicago Full Text PDF", mimeType:"application/pdf"}
  11752.             ];
  11753.             // use fulltext if possible
  11754.             if(fulltext[item.DOI.substr(4)]) {
  11755.                 item.attachments[0].url = item.attachments[0].url.replace("/doi/abs", "/doi/full");
  11756.             }
  11757.             
  11758.             item.complete();
  11759.         });
  11760.         translator.translate();
  11761.         
  11762.         Zotero.done();
  11763.     });
  11764.         
  11765.     Zotero.wait();
  11766. }');
  11767.  
  11768. REPLACE INTO translators VALUES ('f8765470-5ace-4a31-b4bd-4327b960ccd', '1.0.0b3.r1', '', '2007-03-24 22:20:00', 1, 100, 4, 'SpringerLink', 'Simon Kornblith', '^https?://(?:www\.springerlink\.com|springerlink.metapress.com)[^/]*/content/', 
  11769. 'function detectWeb(doc, url) {
  11770.     var namespace = doc.documentElement.namespaceURI;
  11771.     var nsResolver = namespace ? function(prefix) {
  11772.         if (prefix == ''x'') return namespace; else return null;
  11773.     } : null;
  11774.     
  11775.     if(doc.title == "SpringerLink - All Search Results" || doc.title == "SpringerLink - Journal Issue") {
  11776.         return "multiple";
  11777.     } else if(doc.title == "SpringerLink - Book Chapter") {
  11778.         return "bookSection";
  11779.     } else if(doc.evaluate(''//a[text() = "RIS"]'',
  11780.               doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  11781.         return "journalArticle";
  11782.     }
  11783. }',
  11784. 'function doWeb(doc, url) {
  11785.     var namespace = doc.documentElement.namespaceURI;
  11786.     var nsResolver = namespace ? function(prefix) {
  11787.         if (prefix == ''x'') return namespace; else return null;
  11788.     } : null;
  11789.     
  11790.     var m = url.match(/https?:\/\/[^\/]+/);
  11791.     var host = m[0];
  11792.     
  11793.     if(doc.title == "SpringerLink - All Search Results" || doc.title == "SpringerLink - Journal Issue") {        
  11794.         var items = Zotero.Utilities.getItemArray(doc, doc, ''/content/[^/]+/\\?p=[^&]+&pi='');
  11795.         
  11796.         items = Zotero.selectItems(items);
  11797.         if(!items) return true;
  11798.         
  11799.         var urls = new Array();
  11800.         for(var url in items) {
  11801.             urls.push(url);
  11802.         }
  11803.     } else {
  11804.         var urls = [url];
  11805.     }
  11806.     
  11807.     var RIS = new Array();
  11808.     
  11809.     for each(var item in urls) {
  11810.         var m = item.match(/\/content\/([^/]+)/);
  11811.         RIS.push(host+"/export.mpx?code="+m[1]+"&mode=ris");
  11812.     }
  11813.     
  11814.     Zotero.Utilities.HTTP.doGet(RIS, function(text) {
  11815.         // load translator for RIS
  11816.         var translator = Zotero.loadTranslator("import");
  11817.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  11818.         translator.setString(text);
  11819.         translator.setHandler("itemDone", function(obj, item) {
  11820.             var url = urls.shift();
  11821.             var m = url.match(/https?:\/\/[^\/]+\/content\/[^\/]+\//);
  11822.             item.attachments = [
  11823.                 {url:url, title:"SpringerLink Snapshot", mimeType:"text/html"},
  11824.                 {url:m[0]+"fulltext.pdf", title:"SpringerLink Full Text PDF", mimeType:"application/pdf"}
  11825.             ];
  11826.             
  11827.             // fix incorrect authors
  11828.             var oldCreators = item.creators;
  11829.             item.creators = new Array();
  11830.             for each(var creator in oldCreators) {
  11831.                 item.creators.push(Zotero.Utilities.cleanAuthor(creator.lastName, "author"));
  11832.             }
  11833.             
  11834.             // fix incorrect chapters
  11835.             Zotero.debug(item);
  11836.             if(item.publicationTitle && item.itemType == "book") item.itemType = "bookSection";
  11837.             
  11838.             // fix "V" in volume
  11839.             if(item.volume) {
  11840.                 item.volume = item.volume.replace("V", "");
  11841.             }
  11842.             
  11843.             item.complete();
  11844.         });
  11845.         translator.translate();
  11846.     }, function() { Zotero.done() });
  11847.         
  11848.     Zotero.wait();
  11849. }');
  11850.  
  11851. REPLACE INTO translators VALUES ('6614a99-479a-4524-8e30-686e4d66663e', '1.0.0b3.r1', '', '2007-03-24 22:20:00', 1, 100, 4, 'Nature', 'Simon Kornblith', '^https?://www\.nature\.com[^/]*/(?:[^/]+/journal/v[^/]+/n[^/]+/(?:(?:full|abs)/.+\.html|index.html)|search/executeSearch)', 
  11852. 'function detectWeb(doc, url) {
  11853.     var articleRe = /(https?:\/\/[^\/]+\/[^\/]+\/journal\/v[^\/]+\/n[^\/]+\/)(full|abs)(\/.+\.)html/;
  11854.     
  11855.     if(articleRe.test(url)) {
  11856.         return "journalArticle";
  11857.     } else {
  11858.         var namespace = doc.documentElement.namespaceURI;
  11859.         var nsResolver = namespace ? function(prefix) {
  11860.             if (prefix == ''x'') return namespace; else return null;
  11861.         } : null;
  11862.         
  11863.         var tableRows = doc.evaluate(''//*[@class="atl"] | //*[@class="articletitle"] | //h4[@class="norm"]'',
  11864.             doc, nsResolver, XPathResult.ANY_TYPE, null);
  11865.         var fulltextLinks = doc.evaluate(''//a[text() = "Full Text"] | //a[text() = "Full text"] | //a[text() = "Full Text "]'',
  11866.             doc, nsResolver, XPathResult.ANY_TYPE, null);
  11867.         
  11868.         if(tableRows.iterateNext() && fulltextLinks.iterateNext()) {
  11869.             return "multiple";
  11870.         }
  11871.     }
  11872.     
  11873.     return false;
  11874. }',
  11875. 'function doWeb(doc, url) {
  11876.     var namespace = doc.documentElement.namespaceURI;
  11877.     var nsResolver = namespace ? function(prefix) {
  11878.         if (prefix == ''x'') return namespace; else return null;
  11879.     } : null;
  11880.     
  11881.     var articleRe = /(https?:\/\/[^\/]+\/[^\/]+\/journal\/v[^\/]+\/n[^\/]+\/)(full|abs)(\/.+)\.html/;
  11882.     var m = articleRe.exec(url);
  11883.     
  11884.     if(!m) {
  11885.         // search page
  11886.         var items = new Array();
  11887.         
  11888.         var tableRows = doc.evaluate(''//*[@class="atl"] | //*[@class="articletitle"] | //h4[@class="norm"]'',
  11889.             doc, nsResolver, XPathResult.ANY_TYPE, null);
  11890.         var fulltextLinks = doc.evaluate(''//a[text() = "Full Text"] | //a[text() = "Full text"] | //a[text() = "Full Text "]'',
  11891.             doc, nsResolver, XPathResult.ANY_TYPE, null);
  11892.         var tableRow, fulltextLink;
  11893.         while((tableRow = tableRows.iterateNext()) && (fulltextLink = fulltextLinks.iterateNext())) {
  11894.             items[fulltextLink.href] = Zotero.Utilities.cleanString(tableRow.textContent);
  11895.         }
  11896.         
  11897.         items = Zotero.selectItems(items);
  11898.         if(!items) return true;
  11899.         
  11900.         var urls = new Array();
  11901.         for(var url in items) {
  11902.             urls.push(url);
  11903.         }
  11904.     } else {
  11905.         var urls = [url];
  11906.     }
  11907.     
  11908.     var RIS = new Array();
  11909.     var regexps = new Array();
  11910.     
  11911.     for each(var item in urls) {
  11912.         var m = articleRe.exec(item);
  11913.         if(m[3][m[3].length-2] == "_") {
  11914.             m[3] = m[3].substr(0, m[3].length-2);
  11915.         }
  11916.         RIS.push(m[1]+"ris"+m[3]+".ris");
  11917.         regexps.push(m);
  11918.     }
  11919.     
  11920.     Zotero.Utilities.HTTP.doGet(RIS, function(text) {
  11921.         var url = urls.shift();
  11922.         
  11923.         // load translator for RIS
  11924.         var translator = Zotero.loadTranslator("import");
  11925.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  11926.         translator.setString(text);
  11927.         translator.setHandler("itemDone", function(obj, item) {
  11928.             var m = regexps.shift();
  11929.             item.attachments = [
  11930.                 {url:m[0], title:"Nature Snapshot", mimeType:"text/html"},
  11931.                 {url:m[1]+"pdf"+m[3]+".pdf", title:"Nature Full Text PDF", mimeType:"application/pdf"}
  11932.             ]
  11933.             
  11934.             item.notes = new Array();
  11935.             item.date = item.date.replace("print ", "");
  11936.             
  11937.             item.complete();
  11938.         });
  11939.         translator.translate();
  11940.     }, function() { Zotero.done(); });
  11941.         
  11942.     Zotero.wait();
  11943. }');
  11944.  
  11945. REPLACE INTO translators VALUES ('92d4ed84-8d0-4d3c-941f-d4b9124cfbb', '1.0.0b3.r1', '', '2008-01-29 19:00:00', '1', '100', '4', 'IEEE Xplore', 'Simon Kornblith and Michael Berkowitz', 'https?://ieeexplore.ieee.org[^/]*/(?:[^\?]+\?(?:|.*&)arnumber=[0-9]+|search/(?:searchresult.jsp|selected.jsp))', 
  11946. 'function detectWeb(doc, url) {
  11947.     var articleRe = /[?&]arnumber=([0-9]+)/;
  11948.     var m = articleRe.exec(url);
  11949.     
  11950.     if(m) {
  11951.         return "journalArticle";
  11952.     } else {
  11953.         return "multiple";
  11954.     }
  11955.     
  11956.     return false;
  11957. }', 
  11958. 'function doWeb(doc, url) {
  11959.     var namespace = doc.documentElement.namespaceURI;
  11960.     var nsResolver = namespace ? function(prefix) {
  11961.         if (prefix == ''x'') return namespace; else return null;
  11962.     } : null;
  11963.     
  11964.     var articleRe = /[?&]arnumber=([0-9]+)/;
  11965.     var m = articleRe.exec(url);
  11966.     
  11967.     if(!m) {
  11968.         // search page
  11969.         var items = new Array();
  11970.         
  11971.         var tableRows = doc.evaluate(''//table[tbody/tr/td/div/strong]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  11972.         var tableRow;
  11973.         while(tableRow = tableRows.iterateNext()) {
  11974.             var link = doc.evaluate(''.//a[@class="bodyCopy"]'', tableRow, nsResolver, XPathResult.ANY_TYPE,
  11975.                 null).iterateNext().href;
  11976.             
  11977.             var title = "";
  11978.             var strongs = tableRow.getElementsByTagName("strong");
  11979.             for each(var strong in strongs) {
  11980.                 if(strong.textContent) {
  11981.                     title += strong.textContent+" ";
  11982.                 }
  11983.             }
  11984.             
  11985.             items[link] = Zotero.Utilities.cleanString(title);
  11986.         }
  11987.         
  11988.         items = Zotero.selectItems(items);
  11989.         if(!items) return true;
  11990.         
  11991.         var urls = new Array();
  11992.         for(var url in items) {
  11993.             urls.push(url);
  11994.         }
  11995.     } else {
  11996.         var urls = [url];
  11997.     }
  11998.     var arnumber = "";
  11999.     for each(var url in urls) {
  12000.         var m = articleRe.exec(url);
  12001.         arnumber += "%3Carnumber%3E"+m[1]+"%3C%2Farnumber%3E";
  12002.         var newurls = [url];
  12003.         var post = "dlSelect=cite_abs&fileFormate=ris&arnumber="+arnumber+"&x=5&y=10";
  12004.         var isRe = /[?&]isnumber=([0-9]+)/;
  12005.         var puRe = /[?&]punumber=([0-9]+)/;
  12006.         Zotero.Utilities.HTTP.doPost("http://ieeexplore.ieee.org/xpls/citationAct", post, function(text) {
  12007.             // load translator for RIS
  12008.             var translator = Zotero.loadTranslator("import");
  12009.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  12010.             translator.setString(text);
  12011.             translator.setHandler("itemDone", function(obj, item) {
  12012.                 var url = urls.shift();
  12013.                 Zotero.debug(url);
  12014.                 var is = isRe.exec(url);
  12015.                 var pu = puRe.exec(url);
  12016.                 var arnumber = articleRe.exec(url);
  12017.                 
  12018.                 if(item.notes[0] && item.notes[0].note) {
  12019.                     item.abstractNote = item.notes[0].note;
  12020.                     item.notes = new Array();
  12021.                 }
  12022.                 var dupes = new Array();
  12023.                 for (var i = 0 ; i < item.creators.length - 1 ; i++) {
  12024.                     if (item.creators[i].lastName + item.creators[i].firstName == item.creators[i+1].lastName + item.creators[i].firstName) {
  12025.                         dupes.push(i + 1);
  12026.                     }
  12027.                 }
  12028.                 
  12029.                 for (var i in dupes) {
  12030.                     delete item.creators[dupes[i]];
  12031.                 }
  12032.                 var dupes = [];
  12033.                 for (var i = 0 ; i < item.creators.length ; i++) {
  12034.                     if (item.creators[i]) {
  12035.                         dupes.push(item.creators[i]);
  12036.                     }
  12037.                 }
  12038.                 item.creators = dupes;
  12039.                 
  12040.                 Zotero.Utilities.processDocuments(newurls, function(newDoc) {
  12041.                     var xpath = ''//p[@class="bodyCopyBlackLargeSpaced"]'';
  12042.                     item.DOI = newDoc.evaluate(xpath, newDoc, namespace, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/Identifier:\s+([^\n]*)\n/)[1];
  12043.                     var pdfpath = ''//td[2][@class="bodyCopyBlackLarge"]/a[@class="bodyCopy"][substring(text(), 1, 3) = "PDF"]'';
  12044.                     var pdfurl = newDoc.evaluate(pdfpath, newDoc, namespace, XPathResult.ANY_TYPE, null).iterateNext().href;
  12045.                     item.attachments = [{url:pdfurl, title:"IEEE Xplore Full Text PDF", mimeType:"application/pdf"}];
  12046.                     item.complete();
  12047.                 }, function() {Zotero.done;});
  12048.             });
  12049.             translator.translate();
  12050.         });
  12051.     }
  12052.     Zotero.wait();
  12053. }');
  12054.  
  12055. REPLACE INTO translators VALUES ('7bdb79e-a47f-4e3d-b317-ccd5a0a74456', '1.0.0b3.r1', '', '2007-03-24 22:20:00', '1', '100', '4', 'Factiva', 'Simon Kornblith', '^https?://global\.factiva\.com[^/]*/ha/default\.aspx$', 
  12056. 'function detectWeb(doc, url) {
  12057.     var namespace = doc.documentElement.namespaceURI;
  12058.     var nsResolver = namespace ? function(prefix) {
  12059.         if (prefix == ''x'') return namespace; else return null;
  12060.     } : null;
  12061.     
  12062.     if(doc.evaluate(''//tr[@class="headline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  12063.         if(doc.body.className == ''articleView'') {
  12064.             return "newspaperArticle";
  12065.         } else {
  12066.             return "multiple";
  12067.         }
  12068.     }
  12069. }', 
  12070. 'function doWeb(doc, url) {
  12071.     var namespace = doc.documentElement.namespaceURI;
  12072.     var nsResolver = namespace ? function(prefix) {
  12073.         if (prefix == ''x'') return namespace; else return null;
  12074.     } : null;
  12075.     
  12076.     var items = new Array();
  12077.     var singlePage = doc.body.className == ''articleView'';
  12078.     
  12079.     var tableRows = doc.evaluate(''//tr[@class="headline"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12080.     var tableRow;
  12081.     while(tableRow = tableRows.iterateNext()) {
  12082.         var hdl = doc.evaluate(''.//input[@name="hdl"]'', tableRow, nsResolver, XPathResult.ANY_TYPE,
  12083.             null).iterateNext().value;
  12084.         if(!singlePage){
  12085.             items[hdl] = Zotero.Utilities.cleanString(tableRow.getElementsByTagName("a")[0].textContent);
  12086.         } else {
  12087.             var m = doc.evaluate(''.//td[@class="count"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, 
  12088.                 null).iterateNext().textContent.match(/[0-9]+/);
  12089.             items[m[0]] = hdl;
  12090.         }
  12091.     }
  12092.     
  12093.     if(!singlePage) {
  12094.         items = Zotero.selectItems(items);
  12095.         if(!items) return true;
  12096.         
  12097.         var hdls = new Array();
  12098.         for(var hdl in items) {
  12099.             hdls.push(hdl);
  12100.         }
  12101.     } else {
  12102.         var m = doc.evaluate(''//div[@class="articleHeader"][@id="artHdr1"]/span[substring(text(), 1, 7) = "Article"]'',
  12103.             doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent.match(/[0-9]+/);
  12104.         var hdls = [items[m[0]]];
  12105.     }
  12106.     
  12107.     var post = "";
  12108.     
  12109.     var hiddenInputs = doc.evaluate(''//form[@name="PageBaseForm"]//input[@type="hidden"]'', doc, nsResolver,
  12110.         XPathResult.ANY_TYPE, null);
  12111.     var hiddenInput;
  12112.     while(hiddenInput = hiddenInputs.iterateNext()) {
  12113.         // this is some weird shit, but apparently they''re very picky
  12114.         post = post+"&"+hiddenInput.name+"="+escape(hiddenInput.value).replace(/\+/g, "%2B").replace(/\%20/g, "+");
  12115.     }
  12116.     
  12117.     var selects = doc.evaluate(''//form[@name="PageBaseForm"]//select'', doc, nsResolver,
  12118.         XPathResult.ANY_TYPE, null);
  12119.     var select;
  12120.     while(select = selects.iterateNext()) {
  12121.         post = post+"&"+select.name+"="+escape(select.options[select.selectedIndex].value);
  12122.     }
  12123.     
  12124.     for each(var hdl in hdls) {
  12125.         post += "&hdl="+escape(hdl);
  12126.     }
  12127.     post = post.substr(1);
  12128.     
  12129.     Zotero.Utilities.HTTP.doPost("http://global.factiva.com/pps/default.aspx?pp=XML", post, function(text) {
  12130.         // Remove xml parse instruction and doctype
  12131.         text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
  12132.         // kill the XML namespace, too, because we have no way of knowing what it will be, which presents a problem
  12133.         text = text.replace(/<ppsArticleResponse xmlns="[^"]+">/, "<ppsArticleResponse>");
  12134.         // kill hlt tags; they just make parsing harder
  12135.         text = text.replace(/<\/?hlt>/g, "");
  12136.         var xml = new XML(text);
  12137.         
  12138.         // loop through articles
  12139.         for each(var ppsarticle in xml[0]..ppsarticle) {
  12140.             var article = ppsarticle.article;
  12141.             var newItem = new Zotero.Item("newspaperArticle");
  12142.             
  12143.             newItem.title = Zotero.Utilities.cleanString(article.headline.paragraph.text().toString());
  12144.             newItem.publicationTitle = Zotero.Utilities.cleanString(article.sourceName.text().toString());
  12145.             for each(var tag in article..name) {
  12146.                 newItem.tags.push(tag.text().toString());
  12147.             }
  12148.             newItem.date = Zotero.Utilities.formatDate(Zotero.Utilities.strToDate(article.publicationDate.date.text().toString()));
  12149.             if(article.byline.length()) {
  12150.                 var byline = Zotero.Utilities.cleanString(article.byline.text().toString().replace(/By/i, ""));
  12151.                 var authors = byline.split(/ (?:\&|and) /i);
  12152.                 for each(var author in authors) {
  12153.                     newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author"));
  12154.                 }
  12155.             }
  12156.             newItem.section = article.sectionName.text().toString();
  12157.             newItem.edition = article.edition.text().toString();
  12158.             
  12159.             if(article.pages.length()) {
  12160.                 newItem.pages = "";
  12161.                 for each(var page in article.pages.page) {
  12162.                     newItem.pages += ","+page.text().toString();
  12163.                 }
  12164.                 newItem.pages = newItem.pages.substr(1);
  12165.             }
  12166.             
  12167.             var m = article.volume.text().toString().match(/ISSN[:\s]*([\-0-9]{8,9})/i);
  12168.             if(m) newItem.ISSN = m[1];
  12169.             
  12170.             newItem.complete();
  12171.         }
  12172.         
  12173.         Zotero.done();
  12174.     });
  12175.         
  12176.     Zotero.wait();
  12177. }');
  12178.  
  12179. REPLACE INTO translators VALUES ('850f4c5f-71fb-4669-b7da-7fb7a95500ef', '1.0.0b3r1', '', '2008-01-10 19:00:00', '0', '100', '4', 'Cambridge Journals Online', 'Sean Takats', 'https?://[^/]*journals\.cambridge\.org[^/]*/action/(quickSearch|search|displayAbstract|displayFulltext|displayIssue)', 
  12180. 'function detectWeb(doc, url)    {
  12181.     var namespace=doc.documentElement.namespaceURI;
  12182.     var nsResolver=namespace?function(prefix)    {
  12183.         return (prefix=="x")?namespace:null;
  12184.     }:null;
  12185.     var xpath = ''//tr[td/input[@type="checkbox"][@name="toView"]]'';
  12186.     if ((url.indexOf("/action/displayAbstract") != -1) || (url.indexOf("action/displayFulltext") != -1)){
  12187.         return "journalArticle";
  12188.     } else if (doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  12189.         return "multiple";            
  12190.     }
  12191. }', 
  12192. 'function doWeb(doc, url){
  12193.     var namespace=doc.documentElement.namespaceURI;
  12194.     var nsResolver=namespace?function(prefix)    {
  12195.         return (prefix=="x")?namespace:null;
  12196.     }:null;
  12197.     var urlstring="http://journals.cambridge.org/action/exportCitation";
  12198.     var datastring="format=RIS&emailId=&Download=Download&componentIds=";
  12199.     var xpath = ''//tr[td/input[@type="checkbox"][@name="toView"]]'';
  12200.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()){
  12201.         var tableRows = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  12202.         var tableRow;
  12203.         var items=new Array();
  12204.         while (tableRow = tableRows.iterateNext()){
  12205.             var id = doc.evaluate(''./td/input[@type="checkbox"][@name="toView"]/@value'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  12206.             var title = doc.evaluate(''./td/h3'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  12207.             items[id.nodeValue]=Zotero.Utilities.trimInternal(title.textContent);    
  12208.         }
  12209.         items=Zotero.selectItems(items);
  12210.         for(var id in items)
  12211.             Zotero.Utilities.HTTP.doPost(urlstring, datastring+id, function(text)    {
  12212.                 var trans=Zotero.loadTranslator("import");
  12213.                 trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  12214.                 trans.setString(text);
  12215.                 trans.setHandler("itemDone", function(obj, newItem){
  12216.                     var pdfpath=''//tr[td/input/@value="''+id+''"]/td/ul/li/a[contains(text(), "PDF")]'';
  12217.                     var pdflink=doc.evaluate(pdfpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  12218.                     if (pdflink){
  12219.                         newItem.attachments.push({url:pdflink.href, title:newItem.title, mimeType:"application/pdf"});
  12220.                     }
  12221.                     newItem.complete();
  12222.                 });
  12223.                 trans.translate();
  12224.                 Zotero.done();
  12225.             });
  12226.     }
  12227.     xpath = ''//div[@id="close"]/a[text()="close"]'';
  12228.     if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext())    {
  12229.         var pdfpath=''//div/ul/li/a[contains(text(), "PDF")]'';
  12230.         var pdflink =doc.evaluate(pdfpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()
  12231.         Zotero.debug(url);
  12232.         idRe = /aid=([0-9]+)/
  12233.         var m = idRe.exec(url);
  12234.         var id = m[1];
  12235.         Zotero.Utilities.HTTP.doPost(urlstring, datastring+id, function(text)    {
  12236.             var trans=Zotero.loadTranslator("import");
  12237.             trans.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  12238.             trans.setString(text);
  12239.             trans.setHandler("itemDone", function(obj, newItem){
  12240.                 if (pdflink){
  12241.                     newItem.attachments.push({url:pdflink.href, title:newItem.title, mimeType:"application/pdf"});
  12242.                 }
  12243.                 newItem.complete();
  12244.             });
  12245.             trans.translate();
  12246.             Zotero.done();
  12247.         });
  12248.     }
  12249.     Zotero.wait();
  12250. }');
  12251.  
  12252. REPLACE INTO translators VALUES ('82174f4f-8c13-403b-99b2-affc7bc7769b', '1.0.0b3.r1', '', '2007-03-28 00:45:00', '1', '100', '4', 'Cambridge Scientific Abstracts', 'Simon Kornblith', 'https?://[^/]+/ids70/(?:results.php|view_record.php)', 
  12253. 'function detectWeb(doc, url) {
  12254.     var namespace = doc.documentElement.namespaceURI;
  12255.     var nsResolver = namespace ? function(prefix) {
  12256.         if (prefix == ''x'') return namespace; else return null;
  12257.     } : null;
  12258.     
  12259.     if(url.indexOf("/results.php") != -1) {
  12260.         var type = doc.evaluate(''//td[@class="rt_tab_on"]'', doc, nsResolver, XPathResult.ANY_TYPE,
  12261.             null).iterateNext().textContent;
  12262.         
  12263.         if(type.substr(0, 15) == "Published Works") {
  12264.             return "multiple";
  12265.         }
  12266.     } else {
  12267.         // default to journal
  12268.         var itemType = "journalArticle";
  12269.         
  12270.         var type = doc.evaluate(''//tr[td[1][@class="data_heading"]/text() = "Publication Type"]/td[3]'',
  12271.             doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  12272.         if(type) {
  12273.             type = Zotero.Utilities.cleanString(type.textContent);
  12274.             if(type == "Book Chapter") {
  12275.                 return "bookSection";
  12276.             } else if(type.substr(0, 4) == "Book") {
  12277.                 return "book";
  12278.             } else if(type.substr(0, 12) == "Dissertation") {
  12279.                 return "thesis";
  12280.             } else if(type == "Catalog") {
  12281.                 return "magazineArticle";
  12282.             }
  12283.         }
  12284.         return "journalArticle";
  12285.     }
  12286.     
  12287.     return false;
  12288. }', 
  12289. 'function scrape(doc) {
  12290.     var namespace = doc.documentElement.namespaceURI;
  12291.     var nsResolver = namespace ? function(prefix) {
  12292.         if (prefix == ''x'') return namespace; else return null;
  12293.     } : null;
  12294.     
  12295.     var itemType = "journalArticle";
  12296.     
  12297.     var type = doc.evaluate(''//tr[td[1][@class="data_heading"]/text() = "Publication Type"]/td[3]'',
  12298.         doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  12299.     if(type) {
  12300.         type = Zotero.Utilities.cleanString(type.textContent);
  12301.         if(type == "Book Chapter") {
  12302.             itemType = "bookSection";
  12303.         } else if(type.substr(0, 4) == "Book") {
  12304.             itemType = "book";
  12305.         } else if(type.substr(0, 12) == "Dissertation") {
  12306.             itemType = "thesis";
  12307.         } else if(type == "Catalog") {
  12308.             itemType = "magazineArticle";
  12309.         }
  12310.     }
  12311.     
  12312.     var newItem = new Zotero.Item(itemType);
  12313.     
  12314.     newItem.attachments = [{document:doc, title:"Cambridge Scientific Abstracts Snapshot"}];
  12315.     newItem.title = Zotero.Utilities.cleanString(doc.evaluate(''//tr/td[3][@class="data_emphasis"]'', doc, nsResolver,
  12316.         XPathResult.ANY_TYPE, null).iterateNext().textContent);
  12317.     
  12318.     var dataRows = doc.evaluate(''//tr[td[3][@class="data_content"]]'', doc, nsResolver,
  12319.         XPathResult.ANY_TYPE, null);
  12320.     var dataRow;
  12321.     while(dataRow = dataRows.iterateNext()) {
  12322.         var tds = dataRow.getElementsByTagName("td");
  12323.         var heading = Zotero.Utilities.cleanString(tds[0].textContent).toLowerCase();
  12324.         var content = Zotero.Utilities.cleanString(tds[2].textContent);
  12325.         
  12326.         if(heading == "database") {
  12327.             newItem.repository = "Cambridge Scientific Abstracts ("+content+")";
  12328.         } else if(heading == "author") {
  12329.             var authors = content.split("; ");
  12330.             for each(var author in authors) {
  12331.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author", true));
  12332.             }
  12333.         } else if(heading == "source") {
  12334.             if(itemType == "journalArticle") {
  12335.                 var parts = content.split(",");
  12336.                 newItem.publicationTitle = parts.shift();
  12337.                 
  12338.                 var last = parts.pop();
  12339.                 var m = last.match(/([0-9]+)\(([0-9]+)\):([0-9]+)$/);
  12340.                 if(m) {
  12341.                     newItem.volume = m[1];
  12342.                     newItem.issue = m[2];
  12343.                     newItem.pages = m[3];
  12344.                 }
  12345.                 
  12346.                 var volMatch = /vol\.? ([0-9]+)/i;
  12347.                 var noMatch = /no\.? ([0-9]+)/i;
  12348.                 var ppMatch = /pp\.? ([\-0-9]+)/i;
  12349.                 
  12350.                 for each(var part in parts) {
  12351.                     var m = volMatch.exec(part);
  12352.                     if(m) {
  12353.                         newItem.volume = m[1];
  12354.                     } else {
  12355.                         var m = noMatch.exec(part);
  12356.                         if(m) {
  12357.                             newItem.issue = m[1];
  12358.                         } else {
  12359.                             var m = ppMatch.exec(part);
  12360.                             if(m) {
  12361.                                 newItem.pages = m[1];
  12362.                             }
  12363.                         }
  12364.                     }
  12365.                 }
  12366.             } else if(itemType == "book") {
  12367.                 var m = content.match(/^([^:]+): ([^,0-9]+)/);
  12368.                 if(m) {
  12369.                     newItem.place = m[1];
  12370.                     newItem.publisher = m[2];
  12371.                 }
  12372.             } else if(itemType == "bookSection") {
  12373.                 if(content.length > newItem.publicationTitle.length
  12374.                    && content.substr(0, newItem.publicationTitle.length) == newItem.publicationTitle) {
  12375.                     var m = content.match(/\)\. ([^:]+): ([^,0-9]+)/);
  12376.                     if(m) {
  12377.                         newItem.place = m[1];
  12378.                         newItem.publisher = m[2];
  12379.                     }
  12380.                     var m = content.match(/\(pp. ([\-0-9]+)\)/);
  12381.                     if(m) newItem.pages = m[1];
  12382.                 }
  12383.             }
  12384.         } else if(heading == "monograph title") {
  12385.             newItem.publicationTitle = content;
  12386.         } else if(heading == "series title") {
  12387.             newItem.series = content;
  12388.         } else if(heading == "issn") {
  12389.             newItem.ISSN = content;
  12390.         } else if(heading == "isbn") {
  12391.             newItem.ISBN = content;
  12392.         } else if(heading == "abstract") {
  12393.             newItem.abstractNote = content;
  12394.         } else if(heading == "notes") {
  12395.             newItem.extra = content;
  12396.         } else if(heading == "publication year") {
  12397.             if(!newItem.date) newItem.date = content;
  12398.         } else if(heading == "information provider") {
  12399.             if(content.substr(0, 19) == "http://dx.doi.org/") {
  12400.                 newItem.DOI = content.substr(19);
  12401.             }
  12402.         } else if(heading == "journal volume") {
  12403.             newItem.volume = content;
  12404.         } else if(heading == "journal pages") {
  12405.             newItem.pages = content;
  12406.         } else if(heading == "journal issue") {
  12407.             newItem.issue = content;
  12408.         } else if(heading == "affiliation") {
  12409.             if(newItem.itemType == "thesis") {
  12410.                 newItem.publisher = content;
  12411.             }
  12412.         }
  12413.     }
  12414.     
  12415.     var terms = doc.evaluate(''//input[substring(@name, 1, 4) = "term"]'', doc, nsResolver,
  12416.         XPathResult.ANY_TYPE, null);
  12417.     var term;
  12418.     while(term = terms.iterateNext()) {
  12419.         newItem.tags.push(term.value.replace(/ [0-9]{3,}$/, ""));
  12420.     }
  12421.     
  12422.     newItem.complete();
  12423. }
  12424.  
  12425. function doWeb(doc, url) {
  12426.     if(url.indexOf("/results.php") != -1) {
  12427.         var items = Zotero.Utilities.getItemArray(doc, doc, ''/view_record\.php\?'', ''^(?:View Record|More\.{3})$'');
  12428.         
  12429.         items = Zotero.selectItems(items);
  12430.         if(!items) return true;
  12431.         
  12432.         var urls = new Array();
  12433.         for(var url in items) {
  12434.             urls.push(url);
  12435.         }
  12436.         
  12437.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done() })
  12438.         Zotero.wait();
  12439.     } else {
  12440.         scrape(doc);
  12441.     }
  12442. }');
  12443.  
  12444. REPLACE INTO translators VALUES ('e78d20f7-488-4023-831-dfe39679f3f', '1.0.0b3.r1', '', '2008-01-10 09:45:00', '1', '100', '4', 'ACM', 'Simon Kornblith', 'https?://[^/]*portal\.acm\.org[^/]*/(?:results\.cfm|citation\.cfm)', 
  12445. 'function detectWeb(doc, url) {
  12446.     if(url.indexOf("/results.cfm") != -1) {
  12447.         var items = Zotero.Utilities.getItemArray(doc, doc, ''^https?://[^/]+/citation.cfm\\?[^#]+$'');
  12448.         // hack to return multiple if there are items
  12449.         for(var i in items) {
  12450.             return "multiple";
  12451.         }
  12452.     } else {
  12453.         var onClick = doc.evaluate(''//a[substring(text(), 5, 7) = "EndNote"]'', doc, null, XPathResult.ANY_TYPE,
  12454.             null).iterateNext().getAttribute("onClick");
  12455.         if(onClick.match("proceeding.article")) {
  12456.             return "conferencePaper";
  12457.         } else {
  12458.             return "journalArticle";
  12459.         }
  12460.     }
  12461. }', 
  12462. 'var urls = new Array();
  12463.  
  12464. // this handles sequential loading, since first we need to process a document (to get the abstract), then
  12465. // get the Refer metadata, then process the next document, etc.
  12466. function getNext() {
  12467.     if(urls.length) {
  12468.         var url = urls.shift();
  12469.         Zotero.Utilities.processDocuments([url], function(doc) { scrape(doc); });
  12470.     } else {
  12471.         Zotero.done();
  12472.     }
  12473. }
  12474.  
  12475. function scrape(doc) {
  12476.     var onClick = doc.evaluate(''//a[substring(text(), 5, 7) = "EndNote"]'', doc, null, XPathResult.ANY_TYPE,
  12477.         null).iterateNext().getAttribute("onClick");
  12478.     var m = onClick.match(/''([^'']+)''/);
  12479.     
  12480.     var abstract = doc.evaluate(''//div[@class="abstract"]/p[@class="abstract"]'', doc, null,
  12481.         XPathResult.ANY_TYPE, null).iterateNext();
  12482.     if(abstract) abstract = Zotero.Utilities.cleanString(abstract.textContent);
  12483.     
  12484.     var snapshot = doc.location.href;
  12485.     
  12486.     var attachments = new Array();
  12487.     var url;
  12488.     var typeLinks = doc.evaluate(''//td[@class="smaller-text"]/a[img]'', doc, null,
  12489.         XPathResult.ANY_TYPE, null);
  12490.     var typeLink;
  12491.     while(typeLink = typeLinks.iterateNext()) {
  12492.         var linkText = typeLink.textContent.toLowerCase();
  12493.         if(linkText == "pdf") {
  12494.             attachments.push({title:"ACM Full Text PDF", mimeType:"application/pdf", url:typeLink.href});
  12495.             url = typeLink.href;
  12496.         } else if(linkText == "html") {
  12497.             url = snapshot = typeLink.href;
  12498.         }
  12499.     }
  12500.     
  12501.     attachments.push({title:"ACM Snapshot", mimeType:"text/html", url:snapshot});
  12502.  
  12503.     var keywords = new Array();
  12504.     var keywordLinks = doc.evaluate(''//p[@class="keywords"]/a'', doc, null,
  12505.         XPathResult.ANY_TYPE, null);
  12506.     var keywordLink;
  12507.     while(keywordLink = keywordLinks.iterateNext()) {
  12508.         keywords.push(keywordLink.textContent.toLowerCase());
  12509.     }
  12510.     
  12511.     Zotero.Utilities.HTTP.doGet("http://portal.acm.org/"+m[1], function(text) {
  12512.         // split() may no longer be necessary
  12513.         var m = text.split(/<\/?pre[^>]*>/ig);
  12514.         if (m[1]) {
  12515.             var text = m[1];
  12516.         }
  12517.            
  12518.         // load Refer translator
  12519.         var translator = Zotero.loadTranslator("import");
  12520.         translator.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d");
  12521.         translator.setString(text);
  12522.         translator.setHandler("itemDone", function(obj, item) {
  12523.             if(abstract) item.abstractNote = abstract;
  12524.             item.attachments = attachments;
  12525.             item.tags = keywords;
  12526.             item.type = undefined;
  12527.             item.complete();
  12528.         });
  12529.         translator.translate();
  12530.         
  12531.         getNext();
  12532.     });
  12533. }
  12534.  
  12535. function doWeb(doc, url) {
  12536.     if(url.indexOf("/results.cfm") != -1) {
  12537.         var items = Zotero.Utilities.getItemArray(doc, doc, ''^https?://[^/]+/citation.cfm\\?[^#]+$'');
  12538.         
  12539.         items = Zotero.selectItems(items);
  12540.         if(!items) return true;
  12541.         
  12542.         for(var url in items) {
  12543.             urls.push(url);
  12544.         }
  12545.         
  12546.         getNext();
  12547.     } else {
  12548.         scrape(doc);
  12549.     }
  12550.     
  12551.     Zotero.wait();
  12552. }');
  12553.  
  12554. REPLACE INTO translators VALUES ('21ad38-3830-4836-aed7-7b5c2dbfa740', '1.0.0b3.r1', '', '2007-01-10 05:00:00', '1', '100', '4', 'ISI Web of Knowledge', 'Simon Kornblith', '^https?://[^/]+/(?:[^/]+/CIW\.cgi|portal\.cgi)', 
  12555. 'function detectWeb(doc, url) {
  12556.     var namespace = doc.documentElement.namespaceURI;
  12557.     var nsResolver = namespace ? function(prefix) {
  12558.         if (prefix == ''x'') return namespace; else return null;
  12559.     } : null;
  12560.     
  12561.     // require a link to Thomson at the bottom, to weed out other CGIs that
  12562.     // happen to be called CIW.cgi
  12563.     if(!doc.evaluate(''//p[@class="copyright"]/a[@href="http://www.thomson.com/scientific/scientific.jsp"]'',
  12564.         doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  12565.         return false;
  12566.     }
  12567.     
  12568.     if(doc.title.substr(0, 11) == "Full Record") {
  12569.         return "journalArticle";
  12570.     } else if(doc.title.substr(0, 14) == "Search Results") {
  12571.         return "multiple";
  12572.     }
  12573.     
  12574.     return false;
  12575. }', 
  12576. 'function query(formAction, post, docOrUrls, done) {
  12577.     post = post.substr(1)+"&fields=FullNoCitRef";
  12578.     
  12579.     Zotero.Utilities.HTTP.doPost(formAction, post, function(text) {
  12580.         var m = text.match(/<a href="(uml_view.cgi[^"]+)">/);
  12581.         var newURL = "http://portal.isiknowledge.com/uml/"+m[1];
  12582.         Zotero.Utilities.HTTP.doGet(newURL, function(text) {
  12583.             var lines = text.split("\n");
  12584.             
  12585.             var fieldRe = /^[A-Z0-9]{2}(?: |$)/;
  12586.             var field, content, item, authors;
  12587.             
  12588.             for each(var line in lines) {
  12589.                 if(fieldRe.test(line)) {
  12590.                     if(item && field && content) {
  12591.                         if(field == "AF") {
  12592.                             // returns need to be processed separately when dealing with authors
  12593.                             authors = content;
  12594.                         } else if(field == "AU" && !authors)  {
  12595.                             authors = content;
  12596.                         } else {
  12597.                             content = content.replace(/\n/g, " ");
  12598.                             if(field == "TI") {
  12599.                                 item.title = content;
  12600.                             } else if(field == "SO") {
  12601.                                 item.publicationTitle = content;
  12602.                             } else if(field == "DE" || field == "ID" || field == "SC") {
  12603.                                 item.tags = item.tags.concat(content.split("; "));
  12604.                             } else if(field == "AB") {
  12605.                                 item.abstractNote = content;
  12606.                             } else if(field == "PB") {
  12607.                                 item.publisher = content;
  12608.                             } else if(field == "PI") {
  12609.                                 item.place = content;
  12610.                             } else if(field == "SN") {
  12611.                                 item.ISSN = content;
  12612.                             } else if(field == "JI") {
  12613.                                 item.journalAbbreviation = content;
  12614.                             } else if(field == "PD") {
  12615.                                 if(item.date) {
  12616.                                     item.date = content+" "+item.date;
  12617.                                 } else {
  12618.                                     item.date = content;
  12619.                                 }
  12620.                             } else if(field == "PY") {
  12621.                                 if(item.date) {
  12622.                                     item.date += " "+content;
  12623.                                 } else {
  12624.                                     item.date = content;
  12625.                                 }
  12626.                             } else if(field == "VL") {
  12627.                                 item.volume = content;
  12628.                             } else if(field == "IS") {
  12629.                                 item.issue = content;
  12630.                             } else if(field == "BP") {
  12631.                                 item.pages = content;
  12632.                             } else if(field == "EP") {
  12633.                                 if(!item.pages) {
  12634.                                     item.pages = content;
  12635.                                 } else if(item.pages != content) {
  12636.                                     item.pages += "-"+content;
  12637.                                 }
  12638.                             }
  12639.                         }
  12640.                     }
  12641.                     
  12642.                     var field = line.substr(0, 2);
  12643.                     var content = Zotero.Utilities.cleanString(line.substr(3));
  12644.                     if(field == "PT") {
  12645.                         // theoretically, there could be book types, but I don''t know what the codes
  12646.                         // are and Thomson is unlikely to help me figure that out
  12647.                         item = new Zotero.Item("journalArticle");
  12648.                         if(docOrUrls.location) {
  12649.                             item.attachments = [{title:"ISI Web of Science Snapshot", document:docOrUrls}];
  12650.                         } else {
  12651.                             item.attachments = [{title:"ISI Web of Science Snapshot", url:docOrUrls.shift(), mimeType:"text/html"}];
  12652.                         }
  12653.                         field = content = undefined;
  12654.                     } else if(field == "ER") {
  12655.                         if(authors) {
  12656.                             authors = authors.split("\n");
  12657.                             for each(var author in authors) {
  12658.                                 item.creators.push(Zotero.Utilities.cleanAuthor(author, "author", true));
  12659.                             }
  12660.                         }
  12661.                         
  12662.                         item.complete();
  12663.                         item = field = content = authors = undefined;
  12664.                     }
  12665.                 } else {
  12666.                     content += "\n"+Zotero.Utilities.cleanString(line);
  12667.                 }
  12668.             }
  12669.             
  12670.             if(done) {
  12671.                 done();
  12672.             } else {
  12673.                 Zotero.done();
  12674.             }
  12675.         });
  12676.     });
  12677. }
  12678.  
  12679. function crossSearchFetch(services, SID) {
  12680.     // if we''ve fetched everything, we''re done
  12681.     if(!services.length) {
  12682.         Zotero.done();
  12683.         return;
  12684.     }
  12685.     var service = services.shift();
  12686.     Zotero.debug(service);
  12687.     
  12688.     // execute requests
  12689.     var post = "&SID="+SID+"&all_summary_UTs="+service.items.join("%3B");
  12690.     
  12691.     // add marked_list_candidates
  12692.     var i = 1;
  12693.     for each(var marked_list_candidate in service.items) {
  12694.         post += "&marked_list_candidates="+marked_list_candidate+"%2F"+i;
  12695.     }
  12696.     post += "&mark_selection=selected_records&Export.x=10&Export.y=10";
  12697.     
  12698.     // do query
  12699.     query(service.URL, post, service.itemURLs, function() { crossSearchFetch(services, SID) });
  12700. }
  12701.  
  12702. function doWeb(doc, url) {
  12703.     var namespace = doc.documentElement.namespaceURI;
  12704.     var nsResolver = namespace ? function(prefix) {
  12705.         if (prefix == ''x'') return namespace; else return null;
  12706.     } : null;
  12707.     
  12708.     var post = "";
  12709.     
  12710.     // get hidden fields to add to post string
  12711.     var hiddenFields = doc.evaluate(''//input[@type="hidden"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12712.     var hiddenField;
  12713.     while(hiddenField = hiddenFields.iterateNext()) {
  12714.         post += "&"+hiddenField.name+"="+encodeURIComponent(hiddenField.value);
  12715.     }
  12716.     
  12717.     if(doc.title.substr(0, 14) == "Search Results") {
  12718.         var items = new Array();
  12719.         var links = new Array();
  12720.         var tableRow;
  12721.         
  12722.         if(url.indexOf("/portal.cgi") != -1 || url.indexOf("/XS/CIW.cgi") != -1) {
  12723.             // CrossSearch
  12724.             var tableRows = doc.evaluate(''//tr[td/span/input[@name="marked_list_candidates"]]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12725.             while(tableRow = tableRows.iterateNext()) {
  12726.                 var id = tableRow.getElementsByTagName("input")[0].value;
  12727.                 
  12728.                 items[id] = tableRow.getElementsByTagName("b")[0].textContent;
  12729.                 
  12730.                 var linkList = tableRow.getElementsByTagName("a");
  12731.                 for each(var link in linkList) {
  12732.                     if(link.href && link.href.indexOf("&Func=TransferToPublisher&") != -1) {
  12733.                         links[id] = link.href;
  12734.                         break;
  12735.                     }
  12736.                 }
  12737.             }
  12738.             
  12739.             items = Zotero.selectItems(items);
  12740.             if(!items) return true;
  12741.             
  12742.             var serviceRe = /^(https?:\/\/[^\/]+\/).*%26SrcAuth%3D([^%]+)%26/;
  12743.             var queries = new Object();
  12744.             var urls = new Object();
  12745.             
  12746.             // contains an array of service objects with service, URL, itemURLs, and items properties
  12747.             var services = new Array();
  12748.             
  12749.             // build up object of request URL => [marked_list_candidates]
  12750.             for(var id in items) {
  12751.                 var foundService = null;
  12752.                 
  12753.                 var m = serviceRe.exec(links[id]);
  12754.                 for each(var service in services) {
  12755.                     if(service.service == m[2]) {
  12756.                         foundService = service;
  12757.                         break;
  12758.                     }
  12759.                 }
  12760.                 
  12761.                 if(!foundService) {
  12762.                     foundService = new Object();
  12763.                     foundService.service = m[2];
  12764.                     foundService.URL = m[1]+m[2]+"/CIW.cgi";
  12765.                     foundService.itemURLs = new Array();
  12766.                     foundService.items = new Array();
  12767.                     services.push(foundService);
  12768.                 }
  12769.                 
  12770.                 foundService.items.push(id.substr(id.indexOf(":")+1));
  12771.                 foundService.itemURLs.push(links[id]);
  12772.             }
  12773.             
  12774.             var SID = doc.getElementsByName("SID")[0].value;
  12775.             crossSearchFetch(services, SID);
  12776.         } else {
  12777.             var tableRows = doc.evaluate(''//tr[td/input[@name="marked_list_candidates"]]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  12778.             while(tableRow = tableRows.iterateNext()) {
  12779.                 var id = tableRow.getElementsByTagName("input")[0].value;
  12780.                 var link = tableRow.getElementsByTagName("a")[0];
  12781.                 items[id] = link.textContent;
  12782.                 links[id] = link.href;
  12783.             }
  12784.             
  12785.             items = Zotero.selectItems(items);
  12786.             if(!items) return true;
  12787.             
  12788.             var urls = new Array();
  12789.             for(var code in items) {
  12790.                 post += "&marked_list_candidates="+encodeURIComponent(code);
  12791.                 urls.push(links[id]);
  12792.             }
  12793.             post += "&mark_selection=selected_records&Export.x=10&Export.y=10";
  12794.             
  12795.             // get form action
  12796.             var formAction = doc.getElementsByTagName("form")[0].action;
  12797.             // run query
  12798.             query(formAction, post, urls);
  12799.         }
  12800.     } else {
  12801.         post += "&ExportOne.x=10&ExportOne.y=10"
  12802.         
  12803.         // get form action
  12804.         var formAction = doc.getElementsByTagName("form")[0].action;
  12805.         // run query
  12806.         query(formAction, post, doc);
  12807.     }
  12808.     
  12809.     Zotero.wait();
  12810. }');
  12811.  
  12812. REPLACE INTO translators VALUES ('84564450-d633-4de2-bbcc-451ea580f0d6', '1.0.0b3.r1', '', '2007-03-28 20:00:00', '1', '100', '4', 'Gale Literature Resource Center', 'Simon Kornblith', '^https?://[^/]+/servlet/LitRC?(?:|.*&)srchtp=(?:adv)?mla(?:&|$)', 
  12813. 'function detectWeb(doc, url) {
  12814.     var namespace = doc.documentElement.namespaceURI;
  12815.     var nsResolver = namespace ? function(prefix) {
  12816.         if (prefix == ''x'') return namespace; else return null;
  12817.     } : null;
  12818.     
  12819.     if(doc.title.length <= 33 || doc.title.substr(0, 33) != "Literature Resource Center -- MLA") return false;
  12820.     
  12821.     if(url.indexOf("docNum=") != -1) {    // article;
  12822.         return "journalArticle";
  12823.     } else if(doc.evaluate(''//tr[td/span[@class="stndxtralead"]]'', doc, nsResolver,
  12824.        XPathResult.ANY_TYPE, null).iterateNext()) {
  12825.         return "multiple";
  12826.     }
  12827.     
  12828.     return false;
  12829. }', 
  12830. 'function extractCitation(type, citation) {
  12831.     type = Zotero.Utilities.cleanString(type).toLowerCase();
  12832.     citation = Zotero.Utilities.cleanString(citation);
  12833.     
  12834.     if(type == "book article") {
  12835.         var item = new Zotero.Item("bookSection");
  12836.     } else if(type == "book" || type == "book collection") {
  12837.         var item = new Zotero.Item("book");
  12838.     } else if(type == "dissertation abstract") {
  12839.         var item = new Zotero.Item("thesis");
  12840.     } else {
  12841.         var item = new Zotero.Item("journalArticle");
  12842.     }
  12843.     
  12844.     var m;
  12845.     if(item.itemType == "journalArticle" || item.itemType == "thesis") {
  12846.         m = citation.match(/^(.+)\. "([^"]+)" (.+), ([0-9\:]*) ?\(([^\)]+)\)(?:, (?:pp\. ([\-0-9]+)|([\-0-9A-Z]+)))?/);
  12847.         if(!m) return false;
  12848.         
  12849.         item.publicationTitle = m[3];
  12850.         var parts = m[4].split(":");
  12851.         if(parts.length == 2) {
  12852.             item.volume = parts[0];
  12853.             item.issue = parts[1];
  12854.         } else {
  12855.             item.issue = m[4];
  12856.         }
  12857.         item.date = m[5];
  12858.         item.pages = m[6] ? m[6] : m[7];
  12859.     } else if(item.itemType == "book") {
  12860.         m = citation.match(/^(.+)\. "([^"]+)" ([^:]+): ([^,]+), ([0-9]{4})\..*?(?:([0-9]+) pp\.)/);
  12861.         if(!m) return false;
  12862.         
  12863.         item.place = m[3];
  12864.         item.publisher = m[4];
  12865.         item.date = m[5];
  12866.         item.pages = m[6];
  12867.     } else if(item.itemType == "bookSection") {
  12868.         m = citation.match(/^(.+)\. "([^"]+)" pp\. ([\-0-9]+)\. (?:((?:[^\.]*|\([^\)]+\)| [A-Z]\.)*)\.)? ([^\(\)]+). ([^:]+): ([^,]+), ([0-9]{4})/);
  12869.         if(!m) return false;
  12870.         
  12871.         Zotero.debug(m);
  12872.         
  12873.         item.pages = m[3];
  12874.         var bookAuthors = m[4].split(" and ");
  12875.         for each(var bookAuthor in bookAuthors) {
  12876.             var n = bookAuthor.match(/^([^,]+), ([^\(]+)(?: \(([^\)]+)\)?)?$/);
  12877.             if(n) {
  12878.                 var type = (n[3] && n[3].toLowerCase().indexOf("ed.") != -1) ? "editor" : "author";
  12879.                 item.creators.push({lastName:n[1], firstName:n[2], creatorType:type})
  12880.             }
  12881.         }
  12882.         item.publicationTitle = m[5];
  12883.         item.place = m[6];
  12884.         item.publisher = m[7];
  12885.         item.date = m[8];
  12886.     }
  12887.     
  12888.     // add creators
  12889.     var creators = m[1].split("; ");
  12890.     for each(var creator in creators) {
  12891.         item.creators.push(Zotero.Utilities.cleanAuthor(creator, "author", true));
  12892.     }
  12893.     if(m[2][m[2].length-1] == ".") {
  12894.         item.title = m[2].substr(0, m[2].length-1);
  12895.     } else {
  12896.         item.title = m[2];
  12897.     }
  12898.     
  12899.     return item;
  12900. }
  12901.  
  12902. function doWeb(doc, url) {    
  12903.     var namespace = doc.documentElement.namespaceURI;
  12904.     var nsResolver = namespace ? function(prefix) {
  12905.         if (prefix == ''x'') return namespace; else return null;
  12906.     } : null;
  12907.  
  12908.     var uri = doc.location.href;
  12909.     if(url.indexOf("docNum=") != -1) {    // article;
  12910.         var citation = doc.evaluate(''//td[b/text() = "Source Database:"] | //td[*/b/text() = "Source Database:"]'', doc, nsResolver,
  12911.             XPathResult.ANY_TYPE, null).iterateNext().innerHTML;
  12912.         
  12913.         // ugh
  12914.         var parts = citation.split(/<\/CENTER>/i);
  12915.         var citation = parts[parts.length-1];
  12916.         citation = citation.replace(/<script[^>]*>(?:.|[\r\n])*<\/script>/gi, "");
  12917.         citation = citation.replace(/<a[^>]*>(?:.|[\r\n])*<\/a>/gi, "");
  12918.         
  12919.         // big enormous hack, but it works
  12920.         var span = doc.createElement("span");
  12921.         span.innerHTML = citation;
  12922.         citation = span.textContent;
  12923.         
  12924.         var citeM = citation.match(/^\s*([^\n]+)/);
  12925.         var subjectM = citation.match(/Subject Terms:\s+([^\n]+)/);
  12926.         var typeM = citation.match(/Document Type:\s+([^\n]+)/);
  12927.         var issnM = citation.match(/ISSN:\s+([^\n]+)/);
  12928.         
  12929.         var item = extractCitation(typeM[1], citeM[1]);
  12930.         item.tags = subjectM[1].split("; ");
  12931.         
  12932.         if(issnM) item.ISSN = issnM[1];
  12933.         
  12934.         item.complete();
  12935.     } else {                            // search results
  12936.         var items = new Array();
  12937.                 
  12938.         var tableRows = doc.evaluate(''//tr[td/span[@class="stndxtralead"]]'', doc, nsResolver,
  12939.                                      XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  12940.         // Go through table rows
  12941.         for(var i=0; i<tableRows.snapshotLength; i++) {
  12942.             items[i] = doc.evaluate(''./td/span[@class="stndxtralead"]//a'', tableRows.snapshotItem(i),
  12943.                 nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  12944.             items[i] = items[i].substring(1, items[i].length-1);
  12945.         }
  12946.         
  12947.         items = Zotero.selectItems(items);
  12948.         if(!items) return true
  12949.         
  12950.         for(var i in items) {
  12951.             var tableRow = tableRows.snapshotItem(i);
  12952.             
  12953.             var type = doc.evaluate(''./td[3]/span[@class="stndxtralead"]'', tableRow, nsResolver,
  12954.                 XPathResult.ANY_TYPE, null).iterateNext().textContent;
  12955.             var citation = doc.evaluate(''./td/span[@class="stndxtralead"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  12956.             
  12957.             var item = extractCitation(type, citation);
  12958.             if(!item) continue;
  12959.             
  12960.             var terms = doc.evaluate(''.//span[@class="mlasubjects"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  12961.             if(terms) {
  12962.                 // chop off "[Subject Terms: " and "]"
  12963.                 terms = terms.textContent;
  12964.                 terms = terms.substring(16, terms.length-2);
  12965.                 item.tags = terms.split("; ");
  12966.             }
  12967.             
  12968.             item.complete();
  12969.         }
  12970.     }
  12971. }');
  12972.  
  12973. REPLACE INTO translators VALUES ('5eacdb93-20b9-4c46-a89b-523f62935ae4', '1.0.0b3.r1', '', '2007-06-13 01:00:00', '1', '100', '4', 'HighWire', 'Simon Kornblith', '^http://[^/]+/(?:cgi/searchresults|cgi/search|cgi/content/(?:abstract|full|short|summary)|current.dtl$|content/vol[0-9]+/issue[0-9]+/(?:index.dtl)?$)', 
  12974. 'function detectWeb(doc, url) {
  12975.     var namespace = doc.documentElement.namespaceURI;
  12976.     var nsResolver = namespace ? function(prefix) {
  12977.         if (prefix == ''x'') return namespace; else return null;
  12978.     } : null;
  12979.     
  12980.     if(doc.title.indexOf(" -- Search Result") != -1 ||
  12981.       doc.title == "Science/AAAS | Search Results") {
  12982.         if(doc.evaluate(''//table/tbody/tr[td/input[@type="checkbox"][@name="gca"]]'', doc,
  12983.             nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) return "multiple";
  12984.     } else if(doc.title.indexOf(" -- Table of Contents") != -1||
  12985.       doc.title == "Science/AAAS | Science Magazine Search Results") {
  12986.         if(doc.evaluate(''//form/dl'', doc, nsResolver, XPathResult.ANY_TYPE,null).iterateNext()) return "multiple";
  12987.     } else {
  12988.         if(doc.evaluate(''//a[substring(@href, 1, 16) = "/cgi/citmgr?gca="]'', doc, nsResolver,
  12989.             XPathResult.ANY_TYPE, null).iterateNext()) return "journalArticle";
  12990.     }
  12991.     
  12992.     return false;
  12993. }', 
  12994. 'function handleRequests(requests) {
  12995.     if(requests.length == 0) {
  12996.         Zotero.done();
  12997.         return;
  12998.     }
  12999.     
  13000.     var request = requests.shift();
  13001.     var URL = request.baseURL+request.args;
  13002.     
  13003.     Zotero.Utilities.HTTP.doGet(URL, function(text) {
  13004.         // load translator for RIS
  13005.         var translator = Zotero.loadTranslator("import");
  13006.         translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  13007.         translator.setString(text);
  13008.         translator.setHandler("itemDone", function(obj, item) {
  13009.             if(item.notes[0]) {
  13010.                 item.DOI = item.notes[0].note;
  13011.                 item.notes = new Array();
  13012.             }
  13013.             
  13014.             item.attachments = new Array();
  13015.             var snapshot = request.snapshots.shift();
  13016.             var pdf = request.pdfs.shift();
  13017.             if(snapshot) {
  13018.                 if(typeof(snapshot) == "string") {
  13019.                     // string snapshot (from search)
  13020.                     item.attachments.push({title:"HighWire Snapshot", mimeType:"text/html", url:snapshot});
  13021.                 } else {
  13022.                     // document object
  13023.                     item.attachments.push({title:"HighWire Snapshot", document:snapshot});
  13024.                 }
  13025.             }
  13026.             if(pdf) {
  13027.                 var m = pdf.match(/^[^?]+/);
  13028.                 item.attachments.push({title:"HighWire Full Text PDF", mimeType:"application/pdf", url:m[0]+".pdf"});
  13029.             }
  13030.             
  13031.             item.complete();
  13032.         });
  13033.         translator.translate();
  13034.         
  13035.         handleRequests(requests);
  13036.     });
  13037. }
  13038.  
  13039. function doWeb(doc, url) {
  13040.     var namespace = doc.documentElement.namespaceURI;
  13041.     var nsResolver = namespace ? function(prefix) {
  13042.         if (prefix == ''x'') return namespace; else return null;
  13043.     } : null;
  13044.     
  13045.     var requests = new Array();
  13046.     var hostRe = /https?:\/\/[^\/]+/;
  13047.     
  13048.     var isSearch = doc.title.indexOf("Search Result") != -1
  13049.     var isTOC = doc.title.indexOf(" -- Table of Contents") != -1;
  13050.     var isScience = doc.title.indexOf("Science Magazine Search Results") != -1;
  13051.     if(isSearch || isTOC) {
  13052.         // search page
  13053.         var items = new Object();
  13054.         var snapshots = new Object();
  13055.         var pdfs = new Object();
  13056.         
  13057.         if(isTOC) {
  13058.             var gcaRe = /^https?:\/\/[^\/]+\/cgi\/reprint\/([0-9]+\/[0-9]+\/[0-9]+)/;
  13059.             var tableRows = doc.evaluate(''//form/dl'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  13060.         } else if(isScience) {
  13061.             var tableRows = doc.evaluate(''//form/dl/dd'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  13062.             var tableDTs = doc.evaluate(''//form/dl/dt'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  13063.         } else {
  13064.             var tableRows = doc.evaluate(''//table/tbody/tr[td/input[@type="checkbox"]][td/font/strong]'', doc,
  13065.                 nsResolver, XPathResult.ANY_TYPE, null);
  13066.         }
  13067.         
  13068.         var tableRow, link;
  13069.         while(tableRow = tableRows.iterateNext()) {
  13070.             var snapshot = undefined;
  13071.             var pdf = undefined;
  13072.             
  13073.             if(isTOC) {
  13074.                 var title = doc.evaluate(''.//strong'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  13075.                 
  13076.                 var links = doc.evaluate(''.//a'', tableRow, nsResolver, XPathResult.ANY_TYPE, null);
  13077.                 while(link = links.iterateNext()) {
  13078.                     // prefer Full Text snapshots, but take abstracts
  13079.                     if(link.textContent == "[Abstract]") {
  13080.                         if(!snapshot) snapshot = link.href;
  13081.                     } else if (link.textContent == "[Full Text]") {
  13082.                         snapshot = link.href;
  13083.                     } else if(link.textContent == "[PDF]") {
  13084.                         pdf = link.href;
  13085.                         var m = gcaRe.exec(link.href);
  13086.                         var gca = m[1];
  13087.                     }
  13088.                 }
  13089.             } else {
  13090.                 if(isScience) {
  13091.                     var tableDT = tableDTs.iterateNext();
  13092.                     var gca = doc.evaluate(''./input[@type="checkbox"]'', tableDT, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  13093.                     var title = doc.evaluate(''./label'', tableDT, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  13094.                 } else {
  13095.                     var gca = doc.evaluate(''./td/input[@type="checkbox"]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().value;
  13096.                     var title = doc.evaluate(''./td/font/strong'', tableRow, nsResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  13097.                     if(title.snapshotItem(0).textContent.toUpperCase() == title.snapshotItem(0).textContent) {
  13098.                         title = title.snapshotItem(1).textContent;
  13099.                     } else {
  13100.                         title = title.snapshotItem(0).textContent;
  13101.                     }
  13102.                 }
  13103.                 
  13104.                 var links = doc.evaluate(''.//a'', tableRow, nsResolver, XPathResult.ANY_TYPE, null);
  13105.                 while(link = links.iterateNext()) {
  13106.                     // prefer Full Text snapshots, but take abstracts
  13107.                     var textContent = Zotero.Utilities.cleanString(link.textContent);
  13108.                     if((textContent.substr(0, 8) == "Abstract" && !snapshot) || textContent.substr(0, 9) == "Full Text") {
  13109.                         snapshot = link.href;
  13110.                     } else if(textContent.substr(0, 3) == "PDF") {
  13111.                         pdf = link.href;
  13112.                     }
  13113.                 }
  13114.             }
  13115.             
  13116.             snapshots[gca] = snapshot;
  13117.             pdfs[gca] = pdf;
  13118.             
  13119.             items[gca] = Zotero.Utilities.cleanString(title);
  13120.         }
  13121.         
  13122.         items = Zotero.selectItems(items);
  13123.         if(!items) return true;
  13124.         
  13125.         var requests = new Array();
  13126.         for(var gca in items) {
  13127.             var m = hostRe.exec(pdfs[gca]);
  13128.             var baseURL = m[0]+"/cgi/citmgr?type=refman";
  13129.             
  13130.             var thisRequest = null;
  13131.             for each(var request in requests) {
  13132.                 if(request.baseURL == baseURL) {
  13133.                     thisRequest = request;
  13134.                     break;
  13135.                 }
  13136.             }
  13137.             
  13138.             if(!thisRequest) {
  13139.                 thisRequest = new Object();
  13140.                 thisRequest.snapshots = new Array();
  13141.                 thisRequest.pdfs = new Array();
  13142.                 thisRequest.args = "";
  13143.                 thisRequest.baseURL = baseURL;
  13144.                 requests.push(thisRequest);
  13145.             }
  13146.             
  13147.             thisRequest.snapshots.push(snapshots[gca]);
  13148.             thisRequest.pdfs.push(pdfs[gca]);
  13149.             thisRequest.args += "&gca="+gca;
  13150.         }
  13151.     } else {
  13152.         var baseURL = doc.evaluate(''//a[substring(@href, 1, 16) = "/cgi/citmgr?gca="]'', doc, nsResolver,
  13153.             XPathResult.ANY_TYPE, null).iterateNext().href;
  13154.         var pdf = doc.location.href.replace(/\/content\/[^\/]+\//, "/reprint/");
  13155.         Zotero.debug(pdf);
  13156.         var requests = [{baseURL:baseURL, args:"&type=refman", snapshots:[doc], pdfs:[pdf]}];
  13157.     }
  13158.     
  13159.     handleRequests(requests);
  13160.         
  13161.     Zotero.wait();
  13162. }');
  13163.  
  13164. REPLACE INTO translators VALUES ('a354331-981b-43de-a61-bc26dd1be3a9', '1.0.0b3.r1', '', '2007-03-24 22:20:00', '1', '100', '4', 'AMS MathSciNet', 'Simon Kornblith', '^https?://www\.ams\.org[^/]*/mathscinet/search/(?:publications\.html|publdoc\.html)', 
  13165. 'function detectWeb(doc, url) {
  13166.     var namespace = doc.documentElement.namespaceURI;
  13167.     var nsResolver = namespace ? function(prefix) {
  13168.         if (prefix == ''x'') return namespace; else return null;
  13169.     } : null;
  13170.     
  13171.     var tableRows = doc.evaluate(''//div[@id="content"]/form/div[@class="headline"]'', doc, nsResolver,
  13172.             XPathResult.ANY_TYPE, null);
  13173.     if(tableRows.iterateNext()) {
  13174.         return "multiple"
  13175.     } else if(doc.evaluate(''//div[@id="titleSeparator"]/div[@class="navbar"]/span[@class="PageLink"]/a[text() = "Up"]'',
  13176.         doc, nsResolver, XPathResult.ANY_TYPE, null)) {
  13177.         return "journalArticle";
  13178.     }
  13179.     
  13180.     return false;
  13181. }', 
  13182. 'function doWeb(doc, url) {
  13183.     var namespace = doc.documentElement.namespaceURI;
  13184.     var nsResolver = namespace ? function(prefix) {
  13185.         if (prefix == ''x'') return namespace; else return null;
  13186.     } : null;
  13187.     
  13188.     var pub = "http://www.ams.org/mathscinet/search/publications.html?fmt=bibtex";
  13189.     
  13190.     var tableRows = doc.evaluate(''//div[@id="content"]/form/div[@class="headline"]'', doc, nsResolver,
  13191.             XPathResult.ANY_TYPE, null);
  13192.     var tableRow = tableRows.iterateNext();
  13193.     if(tableRow) {
  13194.         // search page
  13195.         var items = new Object();
  13196.         var links = new Object();
  13197.         
  13198.         do {
  13199.             var id = doc.evaluate(''.//input[@type="checkbox"]'', tableRow, nsResolver,
  13200.                 XPathResult.ANY_TYPE, null).iterateNext().value;
  13201.             items[id] = doc.evaluate(''./div[@class="headlineText"]/span[@class="title"]'', tableRow, nsResolver,
  13202.                 XPathResult.ANY_TYPE, null).iterateNext().textContent;
  13203.             links[id] = doc.evaluate(''.//a'', tableRow, nsResolver, XPathResult.ANY_TYPE,
  13204.                 null).iterateNext().href;
  13205.         } while(tableRow = tableRows.iterateNext())
  13206.         
  13207.         
  13208.         items = Zotero.selectItems(items);
  13209.         if(!items) return true;
  13210.         
  13211.         var docLinks = new Array();
  13212.         for(var id in items) {
  13213.             pub += "&b="+id;
  13214.             docLinks.push(links[id]);
  13215.         }
  13216.     } else {
  13217.         var MR = doc.evaluate(''//div[@id="content"]/div[@class="doc"]/div[@class="headline"]/strong'',
  13218.             doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  13219.         pub += "&b="+MR.replace(/^MR0*/, "");
  13220.     }
  13221.     
  13222.     Zotero.Utilities.HTTP.doGet(pub, function(text) {
  13223.         var m = text.match(/<pre>(?:.|[\r\n])*?<\/pre>/g);
  13224.         var bibTeXString = "";
  13225.         for each(var citation in m) {
  13226.             // kill pre tags
  13227.             citation = citation.substring(5, citation.length-6);
  13228.             bibTeXString += citation;
  13229.         }
  13230.         
  13231.         // import using BibTeX
  13232.         var translator = Zotero.loadTranslator("import");
  13233.         translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4");
  13234.         translator.setString(bibTeXString);
  13235.         translator.setHandler("itemDone", function(obj, item) {
  13236.             if(docLinks) {
  13237.                 item.attachments.push({title:"MathSciNet Snapshot", url:docLinks.shift(), mimeType:"text/html"});
  13238.             } else {
  13239.                 item.attachments.push({title:"MathSciNet Snapshot", document:doc});
  13240.             }
  13241.             
  13242.             item.complete();
  13243.         });
  13244.         translator.translate();
  13245.         
  13246.         Zotero.done();
  13247.     });
  13248. }');
  13249.  
  13250. REPLACE INTO translators VALUES ('938ebe32-2b2e-4349-a5b3-b3a05d3de627', '1.0.0b3.r1', '', '2007-12-21 22:00:00', '1', '100', '4', 'ACS Publications', 'Sean Takats', '[^/]*/(?:wls/journals/query/(?:subscriberResults|query)\.html|acs/journals/toc.page|cgi-bin/(?:article|abstract|sample).cgi/[^/]+/[0-9]+/[0-9]+/i[0-9]+/(?:html|abs)/[^\.]+.html)', 
  13251. 'function detectWeb(doc, url) {
  13252.     var namespace = doc.documentElement.namespaceURI;
  13253.     var nsResolver = namespace ? function(prefix) {
  13254.         if (prefix == ''x'') return namespace; else return null;
  13255.     } : null;
  13256.  
  13257.     if(doc.evaluate(''//input[@name="jid"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  13258.         return "multiple";
  13259.     } else if (doc.evaluate(''//jid'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  13260.         return "journalArticle";
  13261.     } 
  13262.     return false;
  13263. }', 
  13264. 'function handleRequests(requests, pdfs) {
  13265.     if(requests.length == 0) {
  13266.         Zotero.done();
  13267.         return;
  13268.     }
  13269.  
  13270.     var request = requests.shift();
  13271.  
  13272.     Zotero.Utilities.HTTP.doGet("http://pubs.acs.org/wls/journals/citation2/Citation?"+request.jid, function() {
  13273.         Zotero.Utilities.HTTP.doPost("http://pubs.acs.org/wls/journals/citation2/Citation",
  13274.                             "includeAbstract=citation-abstract&format=refmgr&submit=1&mode=GET", function(text) {
  13275.             // load translator for RIS
  13276.             var translator = Zotero.loadTranslator("import");
  13277.             translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
  13278.             translator.setString(text);
  13279.             translator.setHandler("itemDone", function(obj, item) {
  13280.                 var pdf = pdfs.shift();
  13281.                 if(pdf) {
  13282.                     item.attachments.push({
  13283.                     title:"ACS Full Text PDF",
  13284.                     url:pdf, mimeType:"application/pdf"
  13285.                     });
  13286.                 }
  13287.                 item.complete();
  13288.                 });
  13289.             translator.translate();
  13290.  
  13291.             handleRequests(requests);
  13292.         });
  13293.     });
  13294. }
  13295.  
  13296. function doWeb(doc, url) {
  13297.     var namespace = doc.documentElement.namespaceURI;
  13298.     var nsResolver = namespace ? function(prefix) {
  13299.         if (prefix == ''x'') return namespace; else return null;
  13300.     } : null;
  13301.  
  13302.     var pdfs = new Array();
  13303.     var requests = new Array();
  13304.  
  13305.     var jids = doc.evaluate(''//tr[td//input[@name="jid"]]'',doc, nsResolver, XPathResult.ANY_TYPE, null);
  13306.     var jid = jids.iterateNext();
  13307.     if(jid) {
  13308.         // search page
  13309.         var items = new Array();
  13310.         var titles = doc.evaluate(''//form[@name="citationSelect"]//tbody/tr[1]//span[@class="textbold"][1]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  13311.         var jids = doc.evaluate(''//form[@name="citationSelect"]//input[@name="jid"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  13312.         var links = doc.evaluate(''//form[@name="citationSelect"]//tbody/tr[2]//a[@class="link"]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  13313.         var title;
  13314.         var jid;
  13315.         var id;
  13316.         var link;
  13317.         while ((title = titles.iterateNext()) && (jid = jids.iterateNext())){
  13318.             id = jid.value
  13319.             items[id] = Zotero.Utilities.cleanString(title.textContent);
  13320.  
  13321.             var link = doc.evaluate(''../../..//a[substring(text(), 1, 3) = "PDF"]'', title, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  13322.                 if(link) {
  13323.                     links[id] = link.href.replace("searchRedirect.cgi", "article.cgi");
  13324.                 }
  13325.         }
  13326.  
  13327.         items = Zotero.selectItems(items);
  13328.         if(!items) return true;
  13329.  
  13330.         var getstring = "";
  13331.         for(var i in items) {
  13332.             getstring = getstring + "jid=" + encodeURIComponent(i) + "&";
  13333.             pdfs.push(links[i]+"?sessid=");
  13334.         }
  13335.         Zotero.debug(getstring);
  13336.         requests.push({jid:getstring});
  13337.     } else {
  13338.         // single page
  13339.         var jid = doc.evaluate(''//jid'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  13340.         jid = jid.substr(jid.indexOf("/")+1);
  13341.         var pdf = doc.evaluate(''/html/body/a[text()="[PDF version of this article]"]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  13342.         if (pdf) {
  13343.             pdf = pdf.href;
  13344.             pdf = pdf.replace("searchRedirect.cgi", "article.cgi");
  13345.             pdfs.push(pdf+"?sessid=");
  13346.         }
  13347.         var requests = [{jid:"jid=" + encodeURIComponent(jid)}]; 
  13348.     }
  13349.  
  13350.     handleRequests(requests, pdfs);
  13351.  
  13352.     Zotero.wait();
  13353. }');
  13354.  
  13355. REPLACE INTO translators VALUES ('72cb2536-3211-41e0-ae8b-974c0385e085', '1.0.0b4.r1', '', '2007-06-21 07:00:00', '0', '100', '4', 'ARTFL Encyclopedie', 'Sean Takats', '/cgi-bin/philologic31/(getobject\.pl\?c\.[0-9]+:[0-9]+\.encyclopedie|search3t\?dbname=encyclopedie0507)', 
  13356. 'function detectWeb(doc, url) {
  13357.     if (url.indexOf("getobject.pl") != -1){
  13358.         return "encyclopediaArticle";
  13359.     } else {
  13360.         return "multiple";
  13361.     }
  13362. }', 
  13363. 'function reconcileAuthor(author){
  13364.     var authorMap = {
  13365.         "Venel":"Venel, Gabriel-Fran├ºois",
  13366.         "d''Aumont":"d''Aumont, Arnulphe",
  13367.         "de La Chapelle":"de La Chapelle, Jean-Baptiste",
  13368.         "Bourgelat":"Bourgelat, Claude",
  13369.         "Dumarsais":"Du Marsais, C├⌐sar Chesneau",
  13370.         "Mallet":"Mallet, Edme-Fran├ºois",
  13371.         "Toussaint":"Toussaint, Fran├ºois-Vincent",
  13372.         "Daubenton":"Daubenton, Louis-Jean-Marie",
  13373.         "d''Argenville": "d''Argenville, Antoine-Joseph Desallier",
  13374.         "Tarin":"Tarin, Pierre",
  13375.         "Vandenesse":"de Vandenesse, Urbain",
  13376.         "Blondel": "Blondel, Jacques-Fran├ºois",
  13377.         "Le Blond":"Le Blond, Guillaume",
  13378.         "Rousseau":"Rousseau, Jean-Jacques",
  13379.         "Eidous":"Eidous, Marc-Antoine",
  13380.         "d''Alembert":"d''Alembert, Jean le Rond",
  13381.         "Louis":"Louis, Antoine",
  13382.         "Bellin":"Bellin, Jacques-Nicolas",
  13383.         "Diderot":"Diderot, Denis",
  13384.         "Diderot1":"Diderot, Denis",
  13385.         "Diderot2":"Diderot, Denis",
  13386.         "de Jaucourt":"de Jaucourt, Chevalier Louis",
  13387.         "Jaucourt":"de Jaucourt, Chevalier Louis",
  13388.         "d''Holbach":"d''Holbach, Baron"
  13389.         /* not yet mapped
  13390.         Yvon
  13391.         Forbonnais
  13392.         Douchet and Beauz├⌐e
  13393.         Boucher d''Argis
  13394.         Lenglet Du Fresnoy
  13395.         Cahusac
  13396.         Pestr├⌐
  13397.         Daubenton, le Subd├⌐l├⌐gu├⌐
  13398.         Goussier
  13399.         de Villiers
  13400.         Barth├¿s
  13401.         Morellet
  13402.         Malouin
  13403.         M├⌐nuret de Chambaud
  13404.         Landois
  13405.         Le Roy
  13406.         */
  13407.     }
  13408.     if(authorMap[author]) {
  13409.         author = authorMap[author];
  13410.     }
  13411.     // remove ARTFL''s trailing 5 for odd contributors (e.g. Turgot5)
  13412.         if (author.substr(author.length-1, 1)=="5"){
  13413.         author = author.substr(0, author.length-1);
  13414.     }
  13415.     return author;
  13416. }
  13417.  
  13418. function scrape (doc){
  13419.     var namespace = doc.documentElement.namespaceURI;
  13420.     var nsResolver = namespace ? function(prefix) {
  13421.         if (prefix == ''x'') return namespace; else return null;
  13422.         } : null;
  13423.         var url = doc.location.href;
  13424.         var newItem = new Zotero.Item("encyclopediaArticle");
  13425.         var xpath = ''/html/body/div[@class="text"]/font'';
  13426.         var titleElmt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  13427.         if (titleElmt) {
  13428.             var title = titleElmt.textContent;
  13429.         } else {
  13430.             xpath = ''/html/body/div[@class="text"]/b'';
  13431.             var title = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  13432.         }
  13433.         newItem.title = title;
  13434.         newItem.encyclopediaTitle = "Encyclop├⌐die, ou Dictionnaire raisonn├⌐ des sciences, des arts et des m├⌐tiers";
  13435.         newItem.shortTitle = "Encyclop├⌐die";
  13436.         newItem.date = "1751-1772";
  13437.         newItem.publisher = "Briasson";
  13438.         newItem.place = "Paris";
  13439.         newItem.url = url;
  13440.     
  13441.         newItem.attachments.push({title:"ARTFL Snapshot", mimeType:"text/html", url:url, snapshot:true});
  13442.     
  13443.         // get author and tags
  13444.         var hostRegexp = new RegExp("^(https?://[^/]+)/");
  13445.         var hMatch = hostRegexp.exec(url);
  13446.         var host = hMatch[1];
  13447.         var getString1 = "/cgi-bin/philologic31/search3t?dbname=encyclopedie0507&word=&dgdivhead=";
  13448.         var getString2 = "&dgdivocauthor=&dgdivocplacename=&dgdivocsalutation=&dgdivocclassification=&dgdivocpartofspeech=&dgdivtype=&CONJUNCT=PHRASE&DISTANCE=3&PROXY=or+fewer&OUTPUT=conc&POLESPAN=5&KWSS=1&KWSSPRLIM=500";
  13449.         
  13450.         Zotero.Utilities.HTTP.doGet(host+getString1+title+getString2, function(text){
  13451.             var tagRe = new RegExp(''>''+title+''</a>[^\[]*\\[([^\\]]*)\]'', ''i'');
  13452.             var m = tagRe.exec(text);
  13453.             if(m[1] != "unclassified"){
  13454.                  var tagstring = m[1].replace("&", "&", "g");
  13455.                 var tags = tagstring.split(";")
  13456.                 for(var j in tags) {
  13457.                     newItem.tags.push(Zotero.Utilities.cleanString(tags[j]));
  13458.                 }
  13459.             }
  13460.             var authorRe = new RegExp(''>''+title+''</a>,([^,]*),'', "i");
  13461.             var m = authorRe.exec(text);
  13462.             var author = m[1];
  13463.             author = Zotero.Utilities.cleanString(author);
  13464.             // reconcile author
  13465.             author = reconcileAuthor(author);    
  13466.             if (author!="NA"){ // ignore unknown authors
  13467.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(author, "author", true));
  13468.             }
  13469.             newItem.creators.push({firstName:"Denis", lastName:"Diderot", creatorType:"editor"});
  13470.             newItem.creators.push({firstName:"Jean le Rond", lastName:"d''Alembert", creatorType:"editor"});
  13471.             newItem.complete();
  13472.         }, function() {Zotero.done();}, null);
  13473.         Zotero.wait();    
  13474. }
  13475.  
  13476. function doWeb(doc, url) {
  13477.     var namespace = doc.documentElement.namespaceURI;
  13478.     var nsResolver = namespace ? function(prefix) {
  13479.         if (prefix == ''x'') return namespace; else return null;
  13480.         } : null;
  13481.  
  13482.     if (url.indexOf("getobject.pl") != -1){
  13483.         // single article
  13484.         scrape(doc);                
  13485.     } else {
  13486.         //search page
  13487.         var items = new Object();
  13488.         var xpath = ''/html/body/div[@class="text"]/p/a'';
  13489.         var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  13490.         var elmt;        
  13491.         while (elmt = elmts.iterateNext()){
  13492.             var title = elmt.textContent;
  13493.             var link = elmt.href;
  13494.             if (title && link){
  13495.                 items[link] = title;
  13496.             }            
  13497.         }
  13498.         var items = Zotero.selectItems(items);
  13499.         if(!items) {
  13500.             return true;
  13501.         }
  13502.         var urls = new Array();
  13503.         for(var i in items) {
  13504.             urls.push(i);
  13505.         }
  13506.         Zotero.Utilities.processDocuments(urls, scrape, function() { Zotero.done(); });
  13507.         Zotero.wait();    
  13508.     }
  13509.         
  13510. }');
  13511.  
  13512. REPLACE INTO translators VALUES ('1b9ed730-69c7-40b0-8a06-517a89a3a278', '1.0.0b3.r1', '', '2007-01-24 01:35:00', '0', '100', '4', 'Sudoc', 'Sean Takats', '^http://www\.sudoc\.abes\.fr', 
  13513. 'function detectWeb(doc, url) {
  13514.         var namespace = doc.documentElement.namespaceURI;
  13515.         var nsResolver = namespace ? function(prefix) {
  13516.                 if (prefix == ''x'') return namespace; else return null;
  13517.         } : null;
  13518.  
  13519.         var xpath = ''//table/tbody/tr/td[1][@class="preslabel"]/strong'';
  13520.         var multxpath = ''//a[@id="InitialFocusPoint"]'';
  13521.         var elt;
  13522.  
  13523.         if (elt = doc.evaluate(multxpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  13524.                 return "multiple";
  13525.         }
  13526.         else if (elt = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) 
  13527.         {
  13528.                 var contenu = elt.textContent;
  13529.                 var numRegexp = /(Num.ro.de.notice|Record.number)/;
  13530.                 var m = numRegexp.exec(contenu);
  13531.                 if (m) {
  13532.                         // On a bien une notice d"ouvrage, on doit chercher limage 
  13533.                         // pour choisir le type de document
  13534.                         var imgXpath = ''/html/body/table/tbody/tr/td[1]/p/img/@src'';
  13535.                         var imgsrc = doc.evaluate(imgXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  13536.                         if (imgsrc){
  13537.                                 if (imgsrc.indexOf("icon_per.gif") > 0){
  13538.                                         return "book";
  13539.                                 } else if (imgsrc.indexOf("icon_books.gif") > 0){
  13540.                                         return "book";
  13541.                                 } else if (imgsrc.indexOf("icon_thesis.gif") > 0){
  13542.                                         return "thesis";
  13543.                                 } else if (imgsrc.indexOf("icon_art.gif") > 0){
  13544.                                         return "journalArticle";
  13545.                                 } else {
  13546.                                         return "book";
  13547.                                 }
  13548.                         } 
  13549.                 }
  13550.         }
  13551. }', 
  13552. 'function scrape(doc) {
  13553.         var namespace = doc.documentElement.namespaceURI;
  13554.         var nsResolver = namespace ? function(prefix) {
  13555.                 if (prefix == ''x'') return namespace; else return null;
  13556.         } : null;
  13557.  
  13558.         var rowXpath = ''//tr[td[@class="preslabel"]]'';
  13559.         var tableRows = doc.evaluate(rowXpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  13560.         var tableRow;
  13561.  
  13562.         var newItem = new Zotero.Item();
  13563.         // TODO add other item types using detectWeb''s icon checking code
  13564.         newItem.itemType = "book";
  13565.         var imgXpath = ''/html/body/table/tbody/tr/td[1]/p/img/@src'';
  13566.         var imgsrc = doc.evaluate(imgXpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  13567.         if (imgsrc){
  13568.                 if (imgsrc.indexOf("icon_per.gif") > 0){
  13569.                         newItem.itemType = "book";
  13570.                 } else if (imgsrc.indexOf("icon_books.gif") > 0){
  13571.                         newItem.itemType = "book";
  13572.                 } else if (imgsrc.indexOf("icon_thesis.gif") > 0){
  13573.                         newItem.itemType = "thesis";
  13574.                 } else if (imgsrc.indexOf("icon_art.gif") > 0){
  13575.                         newItem.itemType = "journalArticle";
  13576.                 } else {
  13577.                         newItem.itemType = "book";
  13578.                 }
  13579.         } else {
  13580.                 newItem.itemType = "book";
  13581.         }
  13582.         while (tableRow = tableRows.iterateNext())
  13583.         {
  13584.                 var field = doc.evaluate(''./td[1]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  13585.                 var value = doc.evaluate(''./td[2]'', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;
  13586.                 field = Zotero.Utilities.superCleanString(field);
  13587.  
  13588.                 if (field == "Titre" || field == "Title"){
  13589.                         Zotero.debug("title = " + value);
  13590.                         value = value.replace(/(\[[^\]]+\])/g,"");
  13591.                         newItem.title = value.split(" / ")[0];
  13592.                 }
  13593.                 if (field.substr(0,6) == "Auteur" || field.substr(0,6) == "Author"){
  13594.                         var authors = doc.evaluate(''./td[2]/a'', tableRow, nsResolver, XPathResult.ANY_TYPE, null);
  13595.                         var author;
  13596.                         while (author = authors.iterateNext()){
  13597.                                 var authorText = author.textContent;
  13598.                                 var authorParts = authorText.split(" ("); 
  13599.                                 newItem.creators.push(Zotero.Utilities.cleanAuthor(authorParts[0], 1, true));
  13600.                         }
  13601.                 }
  13602.                 if (field.substr(0,4) == "Date"){
  13603.                         newItem.date = value;
  13604.                 }
  13605.                 if (field.substr(0,7)  == "Editeur" || field.substr(0,9)  == "Publisher"){
  13606.                         var pubParts = value.split(" : ");
  13607.                         newItem.place = pubParts[0];
  13608.                         // needs error checking below to avoid error
  13609.                         if (pubParts[1] ) {
  13610.                                 pubParts = pubParts[1].split(", ");
  13611.                                 newItem.publisher = pubParts[0];
  13612.                         }
  13613.                 }
  13614.                 if (field.substr(0,4) == "ISBN" || field.substr(0,4) == "ISSN"){
  13615.                         newItem.ISBN = value.split(" (")[0];
  13616.                 }
  13617.                 if (field == "Description") {
  13618.                         var m = value.match(/([0-9]+) (?:[pP])/);
  13619.                         if (m) {
  13620.                                 newItem.pages = m[1];
  13621.                         }
  13622.                 }
  13623.                 if (field.substr(0,5) == "Serie" || field.substr(0,10) == "Collection"){
  13624.                         newItem.series = value;
  13625.                 }
  13626.                 if (field.substr(0,6) == "Sujets" || field.substr(0,8) == "Subjects"){
  13627.                         var subjectElmts = doc.evaluate(''./td[2]/a'', tableRow, nsResolver, XPathResult.ANY_TYPE, null);
  13628.                         var subject;
  13629.                         var subjects;
  13630.                         while (subject = subjectElmts.iterateNext()){
  13631.                                 subjects = subject.textContent.split(" -- ");
  13632.                                 newItem.tags = newItem.tags.concat(subjects);
  13633.                         }
  13634.                 }
  13635.                 if (field == "In" || field == "Dans"){
  13636.                         var jtitle = value.replace(/(\[[^\]]+\])/g,"");
  13637.                         jtitle = jtitle.split(" / ")[0];
  13638.                         jtitle = jtitle.split(" - ")[0];
  13639.                         newItem.publicationTitle = jtitle;
  13640.                         //get page numbers
  13641.                         var m = value.match(/(?:[Pp]\. )([0-9\-]+)/);
  13642.                         if (m) {
  13643.                                 newItem.pages = m[1];
  13644.                         }
  13645.                         //get ISBN or ISSN
  13646.                         m = value.match(/(?:ISSN|ISBN) ([0-9Xx\-]+)/);
  13647.                         if (m) {
  13648.                                 newItem.ISBN = m[1];
  13649.                                 newItem.ISSN = m[1];
  13650.                         }
  13651.                         // publicationTitle, issue/volume
  13652.                 }
  13653.                 // TODO Pages, Notes, Description, Language, Annexes
  13654.         }
  13655.         newItem.complete();
  13656. }
  13657.  
  13658. function doWeb(doc, url) {
  13659.         var namespace = doc.documentElement.namespaceURI;
  13660.         var nsResolver = namespace ? function(prefix) {
  13661.                 if (prefix == ''x'') return namespace; else return null;
  13662.         } : null;
  13663.  
  13664.         var multxpath = ''//a[@id="InitialFocusPoint"]'';
  13665.         var elt;
  13666.  
  13667.         if (elt = doc.evaluate(multxpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
  13668.                 var newUrl = doc.evaluate(''//base/@href'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  13669.                 var xpath = ''//tr/td[3]/a'';
  13670.                 var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  13671.                 var elmt = elmts.iterateNext();
  13672.                 var links = new Array();
  13673.                 var availableItems = new Array();
  13674.                 var i = 0;
  13675.                 do {
  13676.                         var link = doc.evaluate(''./@href'', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  13677.                         var searchTitle = elmt.textContent;
  13678.                         availableItems[i] = searchTitle;
  13679.                         links[i] = link;
  13680.                         i++;
  13681.                 } while (elmt = elmts.iterateNext());
  13682.                 var items = Zotero.selectItems(availableItems);
  13683.  
  13684.                 if(!items) {
  13685.                         return true;
  13686.                 }
  13687.                 var uris = new Array();
  13688.                 for(var i in items) {
  13689.                         uris.push(newUrl + links[i]);
  13690.                 }
  13691.                 Zotero.Utilities.processDocuments(uris, function(doc) { scrape(doc) },
  13692.                         function() { Zotero.done(); }, null);
  13693.                 Zotero.wait();
  13694.         }
  13695.         else {
  13696.                 scrape(doc);
  13697.         }
  13698. }');
  13699.  
  13700.  
  13701. REPLACE INTO translators VALUES ('66928fe3-1e93-45a7-8e11-9df6de0a11b3', '1.0.0b3.r1', '', '2007-03-22 16:35:00', '0', '100', '4', 'Max Planck Institute for the History of Science: Virtual Laboratory Library', 'Sean Takats', 'http://vlp.mpiwg-berlin.mpg.de/library/', 
  13702. 'function detectWeb(doc, url){
  13703.     var namespace = doc.documentElement.namespaceURI;
  13704.         var nsResolver = namespace ? function(prefix) {
  13705.                 if (prefix == ''x'') return namespace; else return null;
  13706.         } : null;
  13707.     var elmt = doc.evaluate(''//base[contains(@href, "/library/data/lit")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  13708.     if (elmt){
  13709.             return "book";
  13710.     }
  13711.     elmt = doc.evaluate(''//span[starts-with(@title, "lit")] | //a[starts-with(@title, "lit")] | //p[starts-with(@title, "lit")]'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  13712.     if (elmt){
  13713.         return "multiple";
  13714.     }
  13715. }', 
  13716. 'function doWeb(doc, url){
  13717.  
  13718.     var namespace = doc.documentElement.namespaceURI;
  13719.         var nsResolver = namespace ? function(prefix) {
  13720.                 if (prefix == ''x'') return namespace; else return null;
  13721.         } : null;
  13722.     var uris = new Array();
  13723.     var baseElmt = doc.evaluate(''//base[contains(@href, "/library/data/lit")]/@href'', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
  13724.     if (baseElmt){
  13725.         var docID = baseElmt.nodeValue;
  13726.         var idRe = /lit[0-9]+/;
  13727.         var m = idRe.exec(docID);
  13728.         uris.push("http://vlp.mpiwg-berlin.mpg.de/library/meta?id=" + m[0]);
  13729.     } else {
  13730.         var searchElmts = doc.evaluate(''//span[starts-with(@title, "lit")] | //a[starts-with(@title, "lit")] | //p[starts-with(@title, "lit")]'', doc, nsResolver, XPathResult.ANY_TYPE, null);
  13731.         var searchElmt;
  13732.         var links = new Array();
  13733.         var availableItems = new Array();
  13734.         var i = 0;
  13735.         while (searchElmt = searchElmts.iterateNext()){
  13736.             availableItems[i] = Zotero.Utilities.cleanString(searchElmt.textContent);
  13737.             var docID = doc.evaluate(''./@title'', searchElmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
  13738.             links.push("http://vlp.mpiwg-berlin.mpg.de/library/meta?id=" + docID);
  13739.             i++;
  13740.         }
  13741.         var items = Zotero.selectItems(availableItems);
  13742.         if(!items) {
  13743.             return true;
  13744.         }
  13745.         var uris = new Array();
  13746.         for(var i in items) {
  13747.             uris.push(links[i]);
  13748.         }
  13749.     }
  13750.     Zotero.Utilities.HTTP.doGet(uris, function(text) {
  13751.         // load Refer translator
  13752.         var translator = Zotero.loadTranslator("import");
  13753.         translator.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d");
  13754.         translator.setString(text);
  13755.         translator.setHandler("itemDone", function(obj, item) {
  13756.             item.type = undefined;
  13757.             item.complete();
  13758.         });
  13759.         translator.translate();
  13760.     }, function() {Zotero.done();}, null);
  13761.     Zotero.wait();
  13762. }');
  13763.  
  13764. REPLACE INTO translators VALUES ('c73a4a8c-3ef1-4ec8-8229-7531ee384cc4', '1.0.0b3.r1', '', '2007-11-05 18:00:00', '1', '100', '4', 'Open WorldCat (Web)', 'Sean Takats', '^http://(?:www\.)?worldcat\.org/(?:search\?|profiles/[^/]+/lists/)', 
  13765. 'function detectWeb(doc, url){
  13766.     var nsResolver = doc.createNSResolver(doc.documentElement);
  13767.  
  13768.     var xpath = ''//table[@class="tableResults" or @class="table-results"]/tbody/tr/td[3][@class="result"]/div[@class="name"]/a/strong'';
  13769.     var results = doc.evaluate(xpath, doc,
  13770.                    nsResolver, XPathResult.ANY_TYPE, null);
  13771.     if(results.iterateNext()) {
  13772.         return "multiple";
  13773.     }
  13774. }', 
  13775. 'function processOWC(doc) {
  13776.     var spanTags = doc.getElementsByTagName("span");
  13777.     for(var i=0; i<spanTags.length; i++) {
  13778.         var spanClass = spanTags[i].getAttribute("class");
  13779.         if(spanClass) {
  13780.             var spanClasses = spanClass.split(" ");
  13781.             if(Zotero.Utilities.inArray("Z3988", spanClasses)) {
  13782.                 var spanTitle = spanTags[i].getAttribute("title");
  13783.                 var item = new Zotero.Item();
  13784.                 if(Zotero.Utilities.parseContextObject(spanTitle, item)) {
  13785.                     if(item.title) {
  13786.                         item.title = Zotero.Utilities.capitalizeTitle(item.title);
  13787.                     } else {
  13788.                         item.title = "[Untitled]";
  13789.                     }
  13790.                     
  13791.                     item.complete();
  13792.                     return true;
  13793.                 } else {
  13794.                     return false;
  13795.                 }
  13796.             }
  13797.         }
  13798.     }
  13799.     
  13800.     return false;
  13801. }
  13802.  
  13803. function doWeb(doc, url){
  13804.     var nsResolver = doc.createNSResolver(doc.documentElement);
  13805.  
  13806.     var urls = new Array();
  13807.     var items = new Array();
  13808.     var xpath = ''//table[@class="tableResults" or @class="table-results"]/tbody/tr/td[3][@class="result"]/div[@class="name"]/a'';
  13809.     var titles = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
  13810.     var title;
  13811.     // Go through titles
  13812.     while(title = titles.iterateNext()) {
  13813.         items[title.href] = title.textContent;
  13814.     }
  13815.  
  13816.     items = Zotero.selectItems(items);
  13817.  
  13818.     if(!items) {
  13819.         return true;
  13820.     }
  13821.  
  13822.     for(var i in items) {
  13823.         urls.push(i);
  13824.     }
  13825.  
  13826.     Zotero.Utilities.processDocuments(urls, function(doc) {
  13827.         processOWC(doc);}, function() {Zotero.done();});
  13828.     Zotero.wait();
  13829. }');
  13830.  
  13831. REPLACE INTO translators VALUES ('e07e9b8c-0e98-4915-bb5a-32a08cb2f365', '1.0.0b3.r1', '', '2007-03-22 18:15:00', 1, 100, 12, 'Open WorldCat (Search)', 'Simon Kornblith', 'http://partneraccess.oclc.org/',
  13832. 'function detectSearch(item) {
  13833.     if(item.itemType == "book" || item.itemType == "bookSection") {
  13834.         return true;
  13835.     }
  13836.     return false;
  13837. }',
  13838. '// creates an item from an Open WorldCat document
  13839. function processOWC(doc) {
  13840.     var spanTags = doc.getElementsByTagName("span");
  13841.     for(var i=0; i<spanTags.length; i++) {
  13842.         var spanClass = spanTags[i].getAttribute("class");
  13843.         if(spanClass) {
  13844.             var spanClasses = spanClass.split(" ");
  13845.             if(Zotero.Utilities.inArray("Z3988", spanClasses)) {
  13846.                 var spanTitle = spanTags[i].getAttribute("title");
  13847.                 var item = new Zotero.Item();
  13848.                 if(Zotero.Utilities.parseContextObject(spanTitle, item)) {
  13849.                     if(item.title) {
  13850.                         item.title = Zotero.Utilities.capitalizeTitle(item.title);
  13851.                     } else {
  13852.                         item.title = "[Untitled]";
  13853.                     }
  13854.                     
  13855.                     item.complete();
  13856.                     return true;
  13857.                 } else {
  13858.                     return false;
  13859.                 }
  13860.             }
  13861.         }
  13862.     }
  13863.     
  13864.     return false;
  13865. }
  13866.  
  13867. function doSearch(item) {
  13868.     if(item.contextObject) {
  13869.         var co = item.contextObject;
  13870.     } else {
  13871.         var co = Zotero.Utilities.createContextObject(item);
  13872.     }
  13873.     
  13874.     Zotero.Utilities.loadDocument("http://partneraccess.oclc.org/wcpa/servlet/OpenUrl?"+co, function(doc) {
  13875.         // find new COinS in the Open WorldCat page
  13876.         if(processOWC(doc)) {    // we got a single item page
  13877.             Zotero.done();
  13878.         } else {                // assume we have a search results page
  13879.             var items = new Array();
  13880.             
  13881.             var namespace = doc.documentElement.namespaceURI;
  13882.             var nsResolver = namespace ? function(prefix) {
  13883.                 if (prefix == ''x'') return namespace; else return null;
  13884.             } : null;
  13885.             
  13886.             // first try to get only books
  13887.             var elmts = doc.evaluate(''//table[@class="tableLayout"]/tbody/tr/td[@class="content"]/table[@class="tableResults"]/tbody/tr[td/img[@alt="Book"]]/td/div[@class="title"]/a'', doc, nsResolver, Components.interfaces.nsIDOMXPathResult.ANY_TYPE,null);
  13888.             var elmt = elmts.iterateNext();
  13889.             if(!elmt) {    // if that fails, look for other options
  13890.                 var elmts = doc.evaluate(''//table[@class="tableLayout"]/tbody/tr/td[@class="content"]/table[@class="tableResults"]/tbody/tr[td/img[@alt="Book"]]/td/div[@class="title"]/a'', doc, nsResolver, Components.interfaces.nsIDOMXPathResult.ANY_TYPE,null);
  13891.                 elmt = elmts.iterateNext()
  13892.             }
  13893.             
  13894.             var urlsToProcess = new Array();
  13895.             do {
  13896.                 urlsToProcess.push(elmt.href);
  13897.             } while(elmt = elmts.iterateNext());
  13898.             
  13899.             Zotero.Utilities.processDocuments(urlsToProcess, function(doc) {
  13900.                 // per URL
  13901.                 processOWC(doc);
  13902.             }, function() {    // done
  13903.                 Zotero.done();
  13904.             });
  13905.         }
  13906.     }, null);
  13907.     
  13908.     Zotero.wait();
  13909. }');
  13910.  
  13911.  
  13912. REPLACE INTO translators VALUES ('11645bd1-0420-45c1-badb-53fb41eeb753', '1.0.0b3.r1', '', '2007-09-15 21:00:00', 1, 100, 8, 'CrossRef', 'Simon Kornblith', 'http://partneraccess.oclc.org/',
  13913. 'function detectSearch(item) {
  13914.     if(item.itemType == "journalArticle") {
  13915.         return true;
  13916.     }
  13917.     return false;
  13918. }',
  13919. 'function processCrossRef(xmlOutput) {
  13920.     xmlOutput = xmlOutput.replace(/<\?xml[^>]*\?>/, "");
  13921.     
  13922.     // parse XML with E4X
  13923.     var qr = new Namespace("http://www.crossref.org/qrschema/2.0");
  13924.     try {
  13925.         var xml = new XML(xmlOutput);
  13926.     } catch(e) {
  13927.         return false;
  13928.     }
  13929.     
  13930.     // ensure status is valid
  13931.     var status = xml.qr::query_result.qr::body.qr::query.@status.toString();
  13932.     if(status != "resolved" && status != "multiresolved") {
  13933.         return false;
  13934.     }
  13935.     
  13936.     var query = xml.qr::query_result.qr::body.qr::query;
  13937.     var item = new Zotero.Item("journalArticle");
  13938.     
  13939.     // try to get a DOI
  13940.     item.DOI = query.qr::doi.(@type=="journal_article").text().toString();
  13941.     if(!item.DOI) {
  13942.         item.DOI = query.qr::doi.(@type=="book_title").text().toString();
  13943.     }
  13944.     if(!item.DOI) {
  13945.         item.DOI = query.qr::doi.(@type=="book_content").text().toString();
  13946.     }
  13947.     
  13948.     // try to get an ISSN (no print/electronic preferences)
  13949.     item.ISSN = query.qr::issn[0].text().toString();
  13950.     // get title
  13951.     item.title = query.qr::article_title.text().toString();
  13952.     // get publicationTitle
  13953.     item.publicationTitle = query.qr::journal_title.text().toString();
  13954.     // get author
  13955.     item.creators.push(Zotero.Utilities.cleanAuthor(query.qr::author.text().toString(), "author", true));
  13956.     // get volume
  13957.     item.volume = query.qr::volume.text().toString();
  13958.     // get issue
  13959.     item.issue = query.qr::issue.text().toString();
  13960.     // get year
  13961.     item.date = query.qr::year.text().toString();
  13962.     // get edition
  13963.     item.edition = query.qr::edition_number.text().toString();
  13964.     // get first page
  13965.     item.pages = query.qr::first_page.text().toString();
  13966.     
  13967.     item.complete();
  13968.     return true;
  13969. }
  13970.  
  13971. function doSearch(item) {
  13972.     if(item.contextObject) {
  13973.         var co = item.contextObject;
  13974.         if(co.indexOf("url_ver=") == -1) {
  13975.             co = "url_ver=Z39.88-2004&"+co;
  13976.         }
  13977.     } else {
  13978.         var co = Zotero.Utilities.createContextObject(item);
  13979.     }
  13980.     
  13981.     Zotero.Utilities.HTTP.doGet("http://www.crossref.org/openurl?req_dat=zter:zter321&"+co+"&noredirect=true", function(responseText) {
  13982.         processCrossRef(responseText);
  13983.         Zotero.done();
  13984.     });
  13985.     
  13986.     Zotero.wait();
  13987. }');
  13988.  
  13989. REPLACE INTO translators VALUES ('af4cf622-eaca-450b-bd45-0f4ba345d081', '1.0.0b3.r1', '', '2006-12-12 22:10:00', 1, 100, 8, 'CiteBase', 'Simon Kornblith', 'http://www.citebase.org/',
  13990. 'function detectSearch(item) {
  13991.     if(item.itemType == "journalArticle") {
  13992.         return true;
  13993.     }
  13994.     return false;
  13995. }',
  13996. 'function doSearch(item) {
  13997.     if(item.contextObject) {
  13998.         var co = item.contextObject;
  13999.         if(co.indexOf("url_ver=") == -1) {
  14000.             co = "url_ver=Z39.88-2004&"+co;
  14001.         }
  14002.         co = co.replace(/(?:&|^)svc_id=[^&]*/, "");
  14003.     } else {
  14004.         var co = Zotero.Utilities.createContextObject(item);
  14005.     }
  14006.     
  14007.     Zotero.Utilities.HTTP.doGet("http://www.citebase.org/openurl?"+co+"&svc_id=bibtex", function(responseText, request) {
  14008.         if(responseText.substr(0, 6) != "<?xml ") {
  14009.             // read BibTeX
  14010.             var translator = Zotero.loadTranslator("import");
  14011.             translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4");
  14012.             translator.setString(responseText);
  14013.             translator.translate();
  14014.         }
  14015.         
  14016.         Zotero.done();
  14017.     });
  14018.     
  14019.     Zotero.wait();
  14020. }');
  14021.  
  14022. REPLACE INTO translators VALUES ('0e2235e7-babf-413c-9acf-f27cce5f059c', '1.0.0b4.r1', '', '2007-03-22 15:55:00', 1, 50, 3, 'MODS', 'Simon Kornblith', 'xml',
  14023. 'Zotero.addOption("exportNotes", true);
  14024.  
  14025. function detectImport() {
  14026.     var read = Zotero.read(512);
  14027.     var modsTagRegexp = /<mods[^>]+>/
  14028.     if(modsTagRegexp.test(read)) {
  14029.         return true;
  14030.     }
  14031. }',
  14032. 'var partialItemTypes = ["bookSection", "journalArticle", "magazineArticle", "newspaperArticle"];
  14033.  
  14034. function doExport() {
  14035.     Zotero.setCharacterSet("utf-8");
  14036.     var modsCollection = <modsCollection xmlns="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd" />;
  14037.     
  14038.     var item;
  14039.     while(item = Zotero.nextItem()) {
  14040.         var isPartialItem = Zotero.Utilities.inArray(item.itemType, partialItemTypes);
  14041.         
  14042.         var mods = <mods />;
  14043.         
  14044.         /** CORE FIELDS **/
  14045.         
  14046.         // XML tag titleInfo; object field title
  14047.         if(item.title) {
  14048.             mods.titleInfo.title = item.title;
  14049.         }
  14050.         
  14051.         // XML tag typeOfResource/genre; object field type
  14052.         var modsType, marcGenre;
  14053.         if(item.itemType == "book" || item.itemType == "bookSection") {
  14054.             modsType = "text";
  14055.             marcGenre = "book";
  14056.         } else if(item.itemType == "journalArticle" || item.itemType == "magazineArticle") {
  14057.             modsType = "text";
  14058.             marcGenre = "periodical";
  14059.         } else if(item.itemType == "newspaperArticle") {
  14060.             modsType = "text";
  14061.             marcGenre = "newspaper";
  14062.         } else if(item.itemType == "thesis") {
  14063.             modsType = "text";
  14064.             marcGenre = "theses";
  14065.         } else if(item.itemType == "letter") {
  14066.             modsType = "text";
  14067.             marcGenre = "letter";
  14068.         } else if(item.itemType == "manuscript") {
  14069.             modsType = "text";
  14070.             modsType.@manuscript = "yes";
  14071.         } else if(item.itemType == "interview") {
  14072.             modsType = "text";
  14073.             marcGenre = "interview";
  14074.         } else if(item.itemType == "film") {
  14075.             modsType = "moving image";
  14076.             marcGenre = "motion picture";
  14077.         } else if(item.itemType == "artwork") {
  14078.             modsType = "still image";
  14079.             marcGenre = "art original";
  14080.         } else if(item.itemType == "webpage") {
  14081.             modsType = "multimedia";
  14082.             marcGenre = "web site";
  14083.         } else if(item.itemType == "note" || item.itemType == "attachment") {
  14084.             continue;
  14085.         }
  14086.         mods.typeOfResource = modsType;
  14087.         mods.genre += <genre authority="local">{item.itemType}</genre>;
  14088.         if(marcGenre) {
  14089.             mods.genre += <genre authority="marcgt">{marcGenre}</genre>;
  14090.         }
  14091.         
  14092.         // XML tag genre; object field thesisType, type
  14093.         if(item.thesisType) {
  14094.             mods.genre += <genre>{item.thesisType}</genre>;
  14095.         }
  14096.         if(item.type) {
  14097.             mods.genre += <genre>{item.type}</genre>;
  14098.         }
  14099.         
  14100.         // XML tag name; object field creators
  14101.         for(var j in item.creators) {
  14102.             var roleTerm = "";
  14103.             if(item.creators[j].creatorType == "author") {
  14104.                 roleTerm = "aut";
  14105.             } else if(item.creators[j].creatorType == "editor") {
  14106.                 roleTerm = "edt";
  14107.             } else if(item.creators[j].creatorType == "creator") {
  14108.                 roleTerm = "ctb";
  14109.             }
  14110.             
  14111.             // FIXME - currently all names are personal
  14112.             mods.name += <name type="personal">
  14113.                 <namePart type="family">{item.creators[j].lastName}</namePart>
  14114.                 <namePart type="given">{item.creators[j].firstName}</namePart>
  14115.                 <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role>
  14116.                 </name>;
  14117.         }
  14118.         
  14119.         // XML tag recordInfo.recordOrigin; used to store our generator note
  14120.         //mods.recordInfo.recordOrigin = "Zotero for Firefox "+Zotero.Utilities.getVersion();
  14121.         
  14122.         /** FIELDS ON NEARLY EVERYTHING BUT NOT A PART OF THE CORE **/
  14123.         
  14124.         // XML tag recordInfo.recordContentSource; object field source
  14125.         if(item.source) {
  14126.             mods.recordInfo.recordContentSource = item.source;
  14127.         }
  14128.         // XML tag recordInfo.recordIdentifier; object field accessionNumber
  14129.         if(item.accessionNumber) {
  14130.             mods.recordInfo.recordIdentifier = item.accessionNumber;
  14131.         }
  14132.         
  14133.         // XML tag accessCondition; object field rights
  14134.         if(item.rights) {
  14135.             mods.accessCondition = item.rights;
  14136.         }
  14137.         
  14138.         /** SUPPLEMENTAL FIELDS **/
  14139.         
  14140.         // Make part its own tag so we can figure out where it goes later
  14141.         var part = new XML();
  14142.         
  14143.         // XML tag detail; object field volume
  14144.         if(item.volume) {
  14145.             if(Zotero.Utilities.isInt(item.volume)) {
  14146.                 part += <detail type="volume"><number>{item.volume}</number></detail>;
  14147.             } else {
  14148.                 part += <detail type="volume"><text>{item.volume}</text></detail>;
  14149.             }
  14150.         }
  14151.         
  14152.         // XML tag detail; object field number
  14153.         if(item.issue) {
  14154.             if(Zotero.Utilities.isInt(item.issue)) {
  14155.                 part += <detail type="issue"><number>{item.issue}</number></detail>;
  14156.             } else {
  14157.                 part += <detail type="issue"><text>{item.issue}</text></detail>;
  14158.             }
  14159.         }
  14160.         
  14161.         // XML tag detail; object field section
  14162.         if(item.section) {
  14163.             if(Zotero.Utilities.isInt(item.section)) {
  14164.                 part += <detail type="section"><number>{item.section}</number></detail>;
  14165.             } else {
  14166.                 part += <detail type="section"><text>{item.section}</text></detail>;
  14167.             }
  14168.         }
  14169.         
  14170.         // XML tag detail; object field pages
  14171.         if(item.pages) {
  14172.             var range = Zotero.Utilities.getPageRange(item.pages);
  14173.             part += <extent unit="pages"><start>{range[0]}</start><end>{range[1]}</end></extent>;
  14174.         }
  14175.         
  14176.         // Assign part if something was assigned
  14177.         if(part.length() != 1) {
  14178.             if(isPartialItem) {
  14179.                 // For a journal article, bookSection, etc., the part is the host
  14180.                 mods.relatedItem.part += <part>{part}</part>;
  14181.             } else {
  14182.                 mods.part += <part>{part}</part>;
  14183.             }
  14184.         }
  14185.         
  14186.         // XML tag originInfo; object fields edition, place, publisher, year, date
  14187.         var originInfo = new XML();
  14188.         if(item.edition) {
  14189.             originInfo += <edition>{item.edition}</edition>;
  14190.         }
  14191.         if(item.place) {
  14192.             originInfo += <place><placeTerm type="text">{item.place}</placeTerm></place>;
  14193.         }
  14194.         if(item.publisher) {
  14195.             originInfo += <publisher>{item.publisher}</publisher>;
  14196.         } else if(item.distributor) {
  14197.             originInfo += <publisher>{item.distributor}</publisher>;
  14198.         }
  14199.         if(item.date) {
  14200.             if(Zotero.Utilities.inArray(item.itemType, ["book", "bookSection"])) {
  14201.                 // Assume year is copyright date
  14202.                 var dateType = "copyrightDate";
  14203.             } else if(Zotero.Utilities.inArray(item.itemType, ["journalArticle", "magazineArticle", "newspaperArticle"])) {
  14204.                 // Assume date is date issued
  14205.                 var dateType = "dateIssued";
  14206.             } else {
  14207.                 // Assume date is date created
  14208.                 var dateType = "dateCreated";
  14209.             }
  14210.             var tag = <{dateType}>{item.date}</{dateType}>;
  14211.             originInfo += tag;
  14212.         }
  14213.         if(item.accessDate) {
  14214.             originInfo += <dateCaptured>{item.accessDate}</dateCaptured>;
  14215.         }
  14216.         if(originInfo.length() != 1) {
  14217.             if(isPartialItem) {
  14218.                 // For a journal article, bookSection, etc., this goes under the host
  14219.                 mods.relatedItem.originInfo += <originInfo>{originInfo}</originInfo>;
  14220.             } else {
  14221.                 mods.originInfo += <originInfo>{originInfo}</originInfo>;
  14222.             }
  14223.         }
  14224.         
  14225.         // XML tag identifier; object fields ISBN, ISSN
  14226.         if(isPartialItem) {
  14227.             var identifier = mods.relatedItem;
  14228.         } else {
  14229.             var identifier = mods;
  14230.         }
  14231.         if(item.ISBN) {
  14232.             identifier.identifier += <identifier type="isbn">{item.ISBN}</identifier>;
  14233.         }
  14234.         if(item.ISSN) {
  14235.             identifier.identifier += <identifier type="issn">{item.ISSN}</identifier>;
  14236.         }
  14237.         if(item.DOI) {
  14238.             mods.identifier += <identifier type="doi">{item.DOI}</identifier>;
  14239.         }
  14240.         
  14241.         // XML tag relatedItem.titleInfo; object field publication
  14242.         if(item.publicationTitle) {
  14243.             mods.relatedItem.titleInfo += <titleInfo><title>{item.publicationTitle}</title></titleInfo>;
  14244.         }
  14245.         
  14246.         // XML tag classification; object field callNumber
  14247.         if(item.callNumber) {
  14248.             mods.classification = item.callNumber;
  14249.         }
  14250.         
  14251.         // XML tag location.physicalLocation; object field archiveLocation
  14252.         if(item.archiveLocation) {
  14253.             mods.location.physicalLocation = item.archiveLocation;
  14254.         }
  14255.         
  14256.         // XML tag location.url; object field archiveLocation
  14257.         if(item.url) {
  14258.             mods.location.url = item.url;
  14259.         }
  14260.         
  14261.         // XML tag title.titleInfo; object field journalAbbreviation
  14262.         if(item.journalAbbreviation) {
  14263.             mods.relatedItem.titleInfo += <titleInfo type="abbreviated"><title>{item.journalAbbreviation}</title></titleInfo>;
  14264.         }
  14265.         
  14266.         // XML tag abstract; object field abstractNote
  14267.         if(item.abstractNote) {
  14268.             mods.abstract = item.abstractNote;
  14269.         }
  14270.         
  14271.         if(mods.relatedItem.length() == 1 && isPartialItem) {
  14272.             mods.relatedItem.@type = "host";
  14273.         }
  14274.         
  14275.         /** NOTES **/
  14276.         
  14277.         if(Zotero.getOption("exportNotes")) {
  14278.             for(var j in item.notes) {
  14279.                 // Add note tag
  14280.                 var note = <note type="content">{item.notes[j].note}</note>;
  14281.                 mods.note += note;
  14282.             }
  14283.         }
  14284.         
  14285.         /** TAGS **/
  14286.         
  14287.         for(var j in item.tags) {
  14288.             mods.subject += <subject><topic>{item.tags[j].tag}</topic></subject>;
  14289.         }
  14290.         
  14291.         
  14292.         // XML tag relatedItem.titleInfo; object field series
  14293.         if(item.seriesTitle || item.series || item.seriesNumber || item.seriesText) {
  14294.             var series = <relatedItem type="series"/>;
  14295.             
  14296.             if(item.series) {
  14297.                 series.titleInfo.title = item.series;
  14298.             }
  14299.             
  14300.             if(item.seriesTitle) {
  14301.                 series.titleInfo.partTitle = item.seriesTitle;
  14302.             }
  14303.             
  14304.             if(item.seriesText) {
  14305.                 series.titleInfo.subTitle = item.seriesText;
  14306.             }
  14307.             
  14308.             if(item.seriesNumber) {
  14309.                 series.titleInfo.partNumber = item.seriesNumber;
  14310.             }
  14311.             
  14312.             // TODO: make this work in import
  14313.             /*if(item.itemType == "bookSection") {
  14314.                 // For a book section, series info must go inside host tag
  14315.                 mods.relatedItem.relatedItem = series;
  14316.             } else {*/
  14317.                 mods.relatedItem += series;
  14318.             //}
  14319.         }
  14320.         
  14321.         modsCollection.mods += mods;
  14322.     }
  14323.     
  14324.     Zotero.write(''<?xml version="1.0"?>''+"\n");
  14325.     Zotero.write(modsCollection.toXMLString());
  14326. }
  14327.  
  14328. function processIdentifiers(newItem, identifier) {
  14329.     for each(var myIdentifier in identifier) {
  14330.         if(myIdentifier.@type == "isbn") {
  14331.             newItem.ISBN = myIdentifier.text().toString()
  14332.         } else if(myIdentifier.@type == "issn") {
  14333.             newItem.ISSN = myIdentifier.text().toString()
  14334.         } else if(myIdentifier.@type == "doi") {
  14335.             newItem.DOI = myIdentifier.text().toString()
  14336.         }
  14337.     }
  14338. }
  14339.  
  14340. function doImport() {
  14341.     var marcGenres = {
  14342.         "book":"book",
  14343.         "periodical":"journalArticle",
  14344.         "newspaper":"newspaperArticle",
  14345.         "theses":"thesis",
  14346.         "letter":"letter",
  14347.         "motion picture":"film",
  14348.         "art original":"artwork",
  14349.         "web site":"webpage"
  14350.     };
  14351.     
  14352.     
  14353.     var text = "";
  14354.     var read;
  14355.     
  14356.     // read until we see if the file begins with a parse instruction
  14357.     read = " ";
  14358.     while(read == " " || read == "\n" || read == "\r") {
  14359.         read = Zotero.read(1);
  14360.     }
  14361.     
  14362.     var firstPart = read + Zotero.read(4);
  14363.     if(firstPart == "<?xml") {
  14364.         // got a parse instruction, read until it ends
  14365.         read = true;
  14366.         while((read !== false) && (read !== ">")) {
  14367.             read = Zotero.read(1);
  14368.             firstPart += read;
  14369.         }
  14370.         var encodingRe = /encoding=[''"]([^''"]+)[''"]/;
  14371.         var m = encodingRe.exec(firstPart);
  14372.         // set character set
  14373.         try {
  14374.             Zotero.setCharacterSet(m[1]);
  14375.         } catch(e) {
  14376.             Zotero.setCharacterSet("utf-8");
  14377.         }
  14378.     } else {
  14379.         Zotero.setCharacterSet("utf-8");
  14380.         text += firstPart;
  14381.     }
  14382.     
  14383.     // read in 16384 byte increments
  14384.     while(read = Zotero.read(16384)) {
  14385.         text += read;
  14386.     }
  14387.     
  14388.     // parse with E4X
  14389.     var m = new Namespace("http://www.loc.gov/mods/v3");
  14390.     // why does this default namespace declaration not work!?
  14391.     default xml namespace = m;
  14392.     var xml = new XML(text);
  14393.     
  14394.     if(xml.m::mods.length()) {
  14395.         var modsElements = xml.m::mods;
  14396.     } else {
  14397.         var modsElements = [xml];
  14398.     }
  14399.     
  14400.     for each(var mods in modsElements) {
  14401.         var newItem = new Zotero.Item();
  14402.         
  14403.         // title
  14404.         for each(var titleInfo in mods.m::titleInfo) {
  14405.             if(titleInfo.@type != "abbreviated") {
  14406.                 newItem.title = titleInfo.m::title;
  14407.             }
  14408.         }
  14409.         // try to get genre from local genre
  14410.         for each(var genre in mods.m::genre) {
  14411.             if(genre.@authority == "local" && Zotero.Utilities.itemTypeExists(genre)) {
  14412.                 newItem.itemType = genre.text().toString();
  14413.             } else if(!newItem.itemType && (genre.@authority == "marcgt" || genre.@authority == "marc")) {
  14414.                 // otherwise, look at the marc genre
  14415.                 newItem.itemType = marcGenres[genre.text().toString()];
  14416.             }
  14417.         }
  14418.         
  14419.         if(!newItem.itemType) {
  14420.             // try to get genre data from host
  14421.             for each(var relatedItem in mods.m::relatedItem) {
  14422.                 if(relatedItem.@type == "host") {
  14423.                     for each(var genre in relatedItem.m::genre) {
  14424.                         if(genre.@authority == "marcgt" || genre.@authority == "marc") {
  14425.                             newItem.itemType = marcGenres[genre.text().toString()];
  14426.                             break;
  14427.                         }
  14428.                     }
  14429.                 }
  14430.             }
  14431.             
  14432.             // check if this is an electronic resource
  14433.             if(!newItem.itemType) {
  14434.                 for each(var form in mods.m::physicalDescription.m::form) {
  14435.                     if(form.@authority == "marcform" || form.@authority == "marc") {
  14436.                         if(form.text().toString() == "electronic") {
  14437.                             newItem.itemType = "webpage";
  14438.                             break;
  14439.                         }
  14440.                     }
  14441.                 }
  14442.                 
  14443.                 if(!newItem.itemType) newItem.itemType = "book";
  14444.             }
  14445.         }
  14446.         
  14447.         var isPartialItem = Zotero.Utilities.inArray(newItem.itemType, partialItemTypes);
  14448.         
  14449.         // TODO: thesisType, type
  14450.         
  14451.         for each(var name in mods.m::name) {
  14452.             // TODO: institutional authors
  14453.             var creator = new Array();
  14454.             for each(var namePart in name.m::namePart) {
  14455.                 if(namePart.@type == "given") {
  14456.                     creator.firstName = namePart.text().toString();
  14457.                 } else if(namePart.@type == "family") {
  14458.                     creator.lastName = namePart.text().toString();
  14459.                 } else {
  14460.                     var backupName = namePart.text().toString();
  14461.                 }
  14462.             }
  14463.             
  14464.             if(backupName && !creator.firstName && !creator.lastName) {
  14465.                 creator = Zotero.Utilities.cleanAuthor(backupName, "author", true);
  14466.             }
  14467.             
  14468.             // look for roles
  14469.             for(var role in name.m::role.m::roleTerm) {
  14470.                 if(role.@type == "code" && role.@authority == "marcrelator") {
  14471.                     if(role == "edt") {
  14472.                         creator.creatorType = "editor";
  14473.                     } else if(role == "ctb") {
  14474.                         creator.creatorType = "contributor";
  14475.                     } else if(role == "trl") {
  14476.                         creator.creatorType = "translator";
  14477.                     }
  14478.                 }
  14479.             }
  14480.             if(!creator.creatorType) creator.creatorType = "author";
  14481.             
  14482.             newItem.creators.push(creator);
  14483.         }
  14484.         
  14485.         // source
  14486.         newItem.source = mods.m::recordInfo.m::recordContentSource.text().toString();
  14487.         // accessionNumber
  14488.         newItem.accessionNumber = mods.m::recordInfo.m::recordIdentifier.text().toString();
  14489.         // rights
  14490.         newItem.rights = mods.m::accessCondition.text().toString();
  14491.         
  14492.         /** SUPPLEMENTAL FIELDS **/
  14493.         
  14494.         var part = false, originInfo = false;
  14495.         
  14496.         // series
  14497.         for each(var relatedItem in mods.m::relatedItem) {
  14498.             if(relatedItem.@type == "host") {
  14499.                 for each(var titleInfo in relatedItem.m::titleInfo) {
  14500.                     if(titleInfo.@type == "abbreviated") {
  14501.                         newItem.journalAbbreviation = titleInfo.m::title.text().toString();
  14502.                         if(!newItem.publicationTitle) newItem.publicationTitle = newItem.journalAbbreviation;
  14503.                     } else {
  14504.                         newItem.publicationTitle = titleInfo.m::title.text().toString();
  14505.                     }
  14506.                 }
  14507.                 part = relatedItem.m::part;
  14508.                 originInfo = relatedItem.m::originInfo;
  14509.                 processIdentifiers(newItem, relatedItem.m::identifier);
  14510.             } else if(relatedItem.@type == "series") {
  14511.                 newItem.series = relatedItem.m::titleInfo.m::title.text().toString();
  14512.                 newItem.seriesTitle = relatedItem.m::titleInfo.m::partTitle.text().toString();
  14513.                 newItem.seriesText = relatedItem.m::titleInfo.m::subTitle.text().toString();
  14514.                 newItem.seriesNumber = relatedItem.m::titleInfo.m::partNumber.text().toString();
  14515.             }
  14516.         }
  14517.         
  14518.         // get part
  14519.         if(!part) {
  14520.             part = mods.m::part;
  14521.             originInfo = mods.m::originInfo;
  14522.         }
  14523.         
  14524.         if(part) {
  14525.             for each(var detail in part.m::detail) {
  14526.                 // volume
  14527.                 if(detail.@type == "volume") {
  14528.                     newItem.volume = detail.m::number.text().toString();
  14529.                     if(!newItem.volume) {
  14530.                         newItem.volume = detail.m::text.text().toString();
  14531.                     }
  14532.                 }
  14533.                 
  14534.                 // number
  14535.                 if(detail.@type == "issue") {
  14536.                     newItem.issue = detail.m::number.text().toString();
  14537.                     if(!newItem.issue) {
  14538.                         newItem.issue = detail.m::text.text().toString();
  14539.                     }
  14540.                 }
  14541.                 
  14542.                 // section
  14543.                 if(detail.@type == "section") {
  14544.                     newItem.section = detail.m::number.text().toString();
  14545.                     if(!newItem.section) {
  14546.                         newItem.section = detail.m::text.text().toString();
  14547.                     }
  14548.                 }
  14549.             }
  14550.             
  14551.             // pages
  14552.             for each(var extent in part.m::extent) {
  14553.                 if(extent.@unit == "pages" || extent.@unit == "page") {
  14554.                     var pagesStart = extent.m::start.text().toString();
  14555.                     var pagesEnd = extent.m::end.text().toString();
  14556.                     if(pagesStart || pagesEnd) {
  14557.                         if(pagesStart == pagesEnd) {
  14558.                             newItem.pages = pagesStart;
  14559.                         } else if(pagesStart && pagesEnd) {
  14560.                             newItem.pages = pagesStart+"-"+pagesEnd;
  14561.                         } else {
  14562.                             newItem.pages = pagesStart+pagesEnd;
  14563.                         }
  14564.                     }
  14565.                 }
  14566.             }
  14567.         }
  14568.         
  14569.         // identifier
  14570.         processIdentifiers(newItem, mods.m::identifier);
  14571.         // edition
  14572.         newItem.edition = originInfo.m::edition.text().toString();
  14573.         // place
  14574.         for each(var placeTerm in originInfo.m::place.m::placeTerm) {
  14575.             if(placeTerm.@type == "text") {
  14576.                 newItem.place = placeTerm.text().toString();
  14577.             }
  14578.         }
  14579.         // publisher/distributor
  14580.         if(originInfo.m::publisher.length()) {
  14581.             if(newItem.itemType == "webpage" || newItem.itemType == "website") {
  14582.                 newItem.publicationTitle = originInfo.m::publisher[0].text().toString();
  14583.             } else {
  14584.                 newItem.publisher = originInfo.m::publisher[0].text().toString();
  14585.             }
  14586.         }
  14587.         // date
  14588.         if(originInfo.m::copyrightDate.length()) {
  14589.             newItem.date = originInfo.m::copyrightDate[0].text().toString();
  14590.         } else if(originInfo.m::dateIssued.length()) {
  14591.             newItem.date = originInfo.m::dateIssued[0].text().toString();
  14592.         } else if(originInfo.m::dateCreated.length()) {
  14593.             newItem.date = originInfo.m::dateCreated[0].text().toString();
  14594.         }
  14595.         // lastModified
  14596.         newItem.lastModified = originInfo.m::dateModified.text().toString();
  14597.         // accessDate
  14598.         newItem.accessDate = originInfo.m::dateCaptured.text().toString();
  14599.         
  14600.         // call number
  14601.         newItem.callNumber = mods.m::classification.text().toString();
  14602.         // archiveLocation
  14603.         newItem.archiveLocation = mods.m::location.m::physicalLocation.text().toString();
  14604.         // url
  14605.         newItem.url = mods.m::location.m::url.text().toString();
  14606.         // abstract
  14607.         newItem.abstractNote = mods.m::abstract.text().toString();
  14608.         
  14609.         /** NOTES **/
  14610.         for each(var note in mods.m::note) {
  14611.             newItem.notes.push({note:note.text().toString()});
  14612.         }
  14613.         
  14614.         /** TAGS **/
  14615.         for each(var subject in mods.m::subject.m::topic) {
  14616.             newItem.tags.push(subject.text().toString());
  14617.         }
  14618.         
  14619.         Zotero.debug(newItem);
  14620.         
  14621.         newItem.complete();
  14622.     }
  14623. }');
  14624.  
  14625. REPLACE INTO translators VALUES ('14763d24-8ba0-45df-8f52-b8d1108e7ac9', '1.0.0b4.r1', '', '2008-01-10 22:00:00', 1, 25, 2, 'Zotero RDF', 'Simon Kornblith', 'rdf',
  14626. 'Zotero.configure("getCollections", true);
  14627. Zotero.configure("dataMode", "rdf");
  14628. Zotero.addOption("exportNotes", true);
  14629. Zotero.addOption("exportFileData", false);',
  14630. 'var rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
  14631.  
  14632. var n = {
  14633.     bib:"http://purl.org/net/biblio#",
  14634.     dc:"http://purl.org/dc/elements/1.1/",
  14635.     dcterms:"http://purl.org/dc/terms/",
  14636.     prism:"http://prismstandard.org/namespaces/1.2/basic/",
  14637.     foaf:"http://xmlns.com/foaf/0.1/",
  14638.     vcard:"http://nwalsh.com/rdf/vCard#",
  14639.     link:"http://purl.org/rss/1.0/modules/link/",
  14640.     z:"http://www.zotero.org/namespaces/export#"
  14641. };
  14642.  
  14643. var container, containerElement;
  14644.  
  14645. function generateSeeAlso(resource, seeAlso) {
  14646.     for(var i in seeAlso) {
  14647.         if(itemResources[seeAlso[i]]) {
  14648.             Zotero.RDF.addStatement(resource, n.dc+"relation", itemResources[seeAlso[i]], false);
  14649.         }
  14650.     }
  14651. }
  14652.  
  14653. function generateTags(resource, tags) {
  14654.     Zotero.debug("processing tags");
  14655.     for each(var tag in tags) {
  14656.         if(tag.type == 1) {
  14657.             var tagResource = Zotero.RDF.newResource();
  14658.             // set tag type and value
  14659.             Zotero.RDF.addStatement(tagResource, rdf+"type", n.z+"AutomaticTag", false);
  14660.             Zotero.RDF.addStatement(tagResource, rdf+"value", tag.tag, true);
  14661.             // add relationship to resource
  14662.             Zotero.RDF.addStatement(resource, n.dc+"subject", tagResource, false);
  14663.         } else {
  14664.             Zotero.RDF.addStatement(resource, n.dc+"subject", tag.tag, true);
  14665.         }
  14666.     }
  14667. }
  14668.  
  14669. function generateCollection(collection) {
  14670.     var collectionResource = "#collection_"+collection.id;
  14671.     Zotero.RDF.addStatement(collectionResource, rdf+"type", n.z+"Collection", false);
  14672.     Zotero.RDF.addStatement(collectionResource, n.dc+"title", collection.name, true);
  14673.     
  14674.     for each(var child in collection.descendents) {
  14675.         // add child list items
  14676.         if(child.type == "collection") {
  14677.             Zotero.RDF.addStatement(collectionResource, n.dcterms+"hasPart", "#collection_"+child.id, false);
  14678.             // do recursive processing of collections
  14679.             generateCollection(child);
  14680.         } else if(itemResources[child.id]) {
  14681.             Zotero.RDF.addStatement(collectionResource, n.dcterms+"hasPart", itemResources[child.id], false);
  14682.         }
  14683.     }
  14684. }
  14685.  
  14686. function generateItem(item, zoteroType, resource) {
  14687.     container = null;
  14688.     containerElement = null;
  14689.     
  14690.     /** CORE FIELDS **/
  14691.     
  14692.     // type
  14693.     var type = null;
  14694.     if(zoteroType == "book") {
  14695.         type = n.bib+"Book";
  14696.     } else if (zoteroType == "bookSection") {
  14697.         type = n.bib+"BookSection";
  14698.         container = n.bib+"Book";
  14699.     } else if(zoteroType == "journalArticle") {
  14700.         type = n.bib+"Article";
  14701.         container = n.bib+"Journal";
  14702.     } else if(zoteroType == "magazineArticle") {
  14703.         type = n.bib+"Article";
  14704.         container = n.bib+"Periodical";
  14705.     } else if(zoteroType == "newspaperArticle") {
  14706.         type = n.bib+"Article";
  14707.         container = n.bib+"Newspaper";
  14708.     } else if(zoteroType == "thesis") {
  14709.         type = n.bib+"Thesis";
  14710.     } else if(zoteroType == "letter") {
  14711.         type = n.bib+"Letter";
  14712.     } else if(zoteroType == "manuscript") {
  14713.         type = n.bib+"Manuscript";
  14714.     } else if(zoteroType == "interview") {
  14715.         type = n.bib+"Interview";
  14716.     } else if(zoteroType == "film") {
  14717.         type = n.bib+"MotionPicture";
  14718.     } else if(zoteroType == "artwork") {
  14719.         type = n.bib+"Illustration";
  14720.     } else if(zoteroType == "webpage") {
  14721.         type = n.bib+"Document";
  14722.         container = n.z+"Website";
  14723.     } else if(zoteroType == "note") {
  14724.         type = n.bib+"Memo";
  14725.         if(!Zotero.getOption("exportNotes")) {
  14726.             return;
  14727.         }
  14728.     } else if(zoteroType == "attachment") {
  14729.         type = n.z+"Attachment";
  14730.     } else if(zoteroType == "report") {
  14731.         type = n.bib+"Report";
  14732.     } else if(zoteroType == "bill") {
  14733.         type = n.bib+"Legislation";
  14734.     } else if(zoteroType == "case") {
  14735.         type = n.bib+"Document";    // ??
  14736.         container = n.bib+"CourtReporter";
  14737.     } else if(zoteroType == "hearing") {
  14738.         type = n.bib+"Report";
  14739.     } else if(zoteroType == "patent") {
  14740.         type = n.bib+"Patent";
  14741.     } else if(zoteroType == "statute") {
  14742.         type = n.bib+"Legislation";
  14743.     } else if(zoteroType == "email") {
  14744.         type = n.bib+"Letter";
  14745.     } else if(zoteroType == "map") {
  14746.         type = n.bib+"Image";
  14747.     } else if(zoteroType == "blogPost") {
  14748.         type = n.bib+"Document";
  14749.         container = n.z+"Blog";
  14750.     } else if(zoteroType == "instantMessage") {
  14751.         type = n.bib+"Letter";
  14752.     } else if(zoteroType == "forumPost") {
  14753.         type = n.bib+"Document";
  14754.         container = n.z+"Forum";
  14755.     } else if(zoteroType == "audioRecording") {
  14756.         type = n.bib+"Recording";
  14757.     } else if(zoteroType == "presentation") {
  14758.         type = n.bib+"ConferenceProceedings";
  14759.     } else if(zoteroType == "videoRecording") {
  14760.         type = n.bib+"Recording";
  14761.     } else if(zoteroType == "tvBroadcast") {
  14762.         type = n.bib+"Recording";
  14763.     } else if(zoteroType == "radioBroadcast") {
  14764.         type = n.bib+"Recording";
  14765.     } else if(zoteroType == "podcast") {
  14766.         type = n.bib+"Recording";
  14767.     } else if(zoteroType == "computerProgram") {
  14768.         type = n.bib+"Data";
  14769.     }
  14770.     
  14771.     if(type) {
  14772.         Zotero.RDF.addStatement(resource, rdf+"type", type, false);
  14773.     }
  14774.     Zotero.RDF.addStatement(resource, n.z+"itemType", zoteroType, true);
  14775.     
  14776.     // generate section
  14777.     if(item.section) {
  14778.         var section = Zotero.RDF.newResource();
  14779.         // set section type
  14780.         Zotero.RDF.addStatement(section, rdf+"type", n.bib+"Part", false);
  14781.         // set section title
  14782.         Zotero.RDF.addStatement(section, n.dc+"title", item.section, true);
  14783.         // add relationship to resource
  14784.         Zotero.RDF.addStatement(resource, n.dcterms+"isPartOf", section, false);
  14785.     }
  14786.     
  14787.     // generate container
  14788.     if(container) {
  14789.         if(item.ISSN && !Zotero.RDF.getArcsIn("urn:issn:"+item.ISSN)) {
  14790.             // use ISSN as container URI if no other item is
  14791.             containerElement = "urn:issn:"+item.ISSN
  14792.         } else {
  14793.             containerElement = Zotero.RDF.newResource();
  14794.         }
  14795.         // attach container to section (if exists) or resource
  14796.         Zotero.RDF.addStatement((section ? section : resource), n.dcterms+"isPartOf", containerElement, false);
  14797.         // add container type
  14798.         Zotero.RDF.addStatement(containerElement, rdf+"type", container, false);
  14799.     }
  14800.     
  14801.     // generate series
  14802.     if(item.series || item.seriesTitle || item.seriesText || item.seriesNumber) {
  14803.         var series = Zotero.RDF.newResource();
  14804.         // set series type
  14805.         Zotero.RDF.addStatement(series, rdf+"type", n.bib+"Series", false);
  14806.         // add relationship to resource
  14807.         Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dcterms+"isPartOf", series, false);
  14808.     }
  14809.     
  14810.     // generate publisher
  14811.     if(item.publisher || item.distributor || item.label || item.company || item.institution || item.place) {
  14812.         var organization = Zotero.RDF.newResource();
  14813.         // set organization type
  14814.         Zotero.RDF.addStatement(organization, rdf+"type", n.foaf+"Organization", false);
  14815.         // add relationship to resource
  14816.         Zotero.RDF.addStatement(resource, n.dc+"publisher", organization, false);
  14817.     }
  14818.     
  14819.     var typeProperties = ["reportType", "videoRecordingType", "letterType",
  14820.                             "manuscriptType", "mapType", "thesisType", "websiteType",
  14821.                             "audioRecordingType", "presentationType", "postType",
  14822.                             "audioFileType"];
  14823.     var ignoreProperties = ["itemID", "itemType", "firstCreator", "dateAdded",
  14824.                             "dateModified", "section", "sourceItemID"];
  14825.     
  14826.     // creators
  14827.     if(item.creators) {            // authors/editors/contributors
  14828.         var creatorContainers = new Object();
  14829.         
  14830.         // not yet in biblio
  14831.         var biblioCreatorTypes = ["author", "editor", "contributor"];
  14832.         
  14833.         for(var j in item.creators) {
  14834.             var creator = Zotero.RDF.newResource();
  14835.             Zotero.RDF.addStatement(creator, rdf+"type", n.foaf+"Person", false);
  14836.             // gee. an entire vocabulary for describing people, and these aren''t even
  14837.             // standardized in it. oh well. using them anyway.
  14838.             Zotero.RDF.addStatement(creator, n.foaf+"surname", item.creators[j].lastName, true);
  14839.             Zotero.RDF.addStatement(creator, n.foaf+"givenname", item.creators[j].firstName, true);
  14840.             
  14841.             if(biblioCreatorTypes.indexOf(item.creators[j].creatorType) != -1) {
  14842.                 var cTag = n.bib+item.creators[j].creatorType+"s";
  14843.             } else {
  14844.                 var cTag = n.z+item.creators[j].creatorType+"s";
  14845.             }
  14846.             
  14847.             if(!creatorContainers[cTag]) {
  14848.                 var creatorResource = Zotero.RDF.newResource();
  14849.                 // create new seq for author type
  14850.                 creatorContainers[cTag] = Zotero.RDF.newContainer("seq", creatorResource);
  14851.                 // attach container to resource
  14852.                 Zotero.RDF.addStatement(resource, cTag, creatorResource, false);
  14853.             }
  14854.             Zotero.RDF.addContainerElement(creatorContainers[cTag], creator, false);
  14855.         }
  14856.     }
  14857.     
  14858.     // notes
  14859.     if(item.notes && Zotero.getOption("exportNotes")) {
  14860.         for(var j in item.notes) {
  14861.             var noteResource = itemResources[item.notes[j].itemID];
  14862.             
  14863.             // add note tag
  14864.             Zotero.RDF.addStatement(noteResource, rdf+"type", n.bib+"Memo", false);
  14865.             // add note item.notes
  14866.             Zotero.RDF.addStatement(noteResource, rdf+"value", item.notes[j].note, true);
  14867.             // add relationship between resource and note
  14868.             Zotero.RDF.addStatement(resource, n.dcterms+"isReferencedBy", noteResource, false);
  14869.             
  14870.             // Add see also info to RDF
  14871.             generateSeeAlso(noteResource, item.notes[j].seeAlso);
  14872.             generateTags(noteResource, item.notes[j].tags);
  14873.         }
  14874.     }
  14875.     
  14876.     // child attachments
  14877.     if(item.attachments) {
  14878.         for each(var attachment in item.attachments) {
  14879.             var attachmentResource = itemResources[attachment.itemID];
  14880.             Zotero.RDF.addStatement(resource, n.link+"link", attachmentResource, false);
  14881.             generateItem(attachment, "attachment", attachmentResource);
  14882.         }
  14883.     }
  14884.     
  14885.     // relative file path for attachment items
  14886.     if(item.path) {
  14887.         Zotero.RDF.addStatement(resource, rdf+"resource", item.path, false);
  14888.     }
  14889.     
  14890.     // seeAlso and tags
  14891.     if(item.seeAlso) generateSeeAlso(resource, item.seeAlso);
  14892.     if(item.tags) generateTags(resource, item.tags);
  14893.     
  14894.     for(var property in item.uniqueFields) {
  14895.         var value = item[property];
  14896.         if(!value) continue;
  14897.         
  14898.         if(property == "title") {                    // title
  14899.             Zotero.RDF.addStatement(resource, n.dc+"title", value, true);
  14900.         } else if(property == "source") {            // authors/editors/contributors
  14901.             Zotero.RDF.addStatement(resource, n.dc+"source", value, true);
  14902.         } else if(property == "url") {                // url
  14903.             // add url as identifier
  14904.             var term = Zotero.RDF.newResource();
  14905.             // set term type
  14906.             Zotero.RDF.addStatement(term, rdf+"type", n.dcterms+"URI", false);
  14907.             // set url value
  14908.             Zotero.RDF.addStatement(term, rdf+"value", value, true);
  14909.             // add relationship to resource
  14910.             Zotero.RDF.addStatement(resource, n.dc+"identifier", term, false);
  14911.         } else if(property == "accessionNumber") {    // accessionNumber as generic ID
  14912.             Zotero.RDF.addStatement(resource, n.dc+"identifier", value, true);
  14913.         } else if(property == "rights") {            // rights
  14914.             Zotero.RDF.addStatement(resource, n.dc+"rights", value, true);
  14915.         } else if(property == "edition" ||            // edition
  14916.                   property == "version") {            // version
  14917.             Zotero.RDF.addStatement(resource, n.prism+"edition", value, true);
  14918.         } else if(property == "date") {                // date
  14919.             Zotero.RDF.addStatement(resource, n.dc+"date", value, true);
  14920.         } else if(property == "accessDate") {        // accessDate
  14921.             Zotero.RDF.addStatement(resource, n.dcterms+"dateSubmitted", value, true);
  14922.         } else if(property == "issueDate") {        // issueDate
  14923.             Zotero.RDF.addStatement(resource, n.dcterms+"issued", value, true);
  14924.         } else if(property == "pages") {            // pages
  14925.             // not yet part of biblio, but should be soon
  14926.             Zotero.RDF.addStatement(resource, n.bib+"pages", value, true);
  14927.         } else if(property == "extra") {            // extra
  14928.             Zotero.RDF.addStatement(resource, n.dc+"description", value, true);
  14929.         } else if(property == "mimeType") {            // mimeType
  14930.             Zotero.RDF.addStatement(resource, n.link+"type", value, true);
  14931.         } else if(property == "charset") {            // charset
  14932.             Zotero.RDF.addStatement(resource, n.link+"charset", value, true);
  14933.         // THE FOLLOWING ARE ALL PART OF THE CONTAINER
  14934.         } else if(property == "ISSN") {                // ISSN
  14935.             Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dc+"identifier", "ISSN "+value, true);
  14936.         } else if(property == "ISBN") {                // ISBN
  14937.             Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dc+"identifier", "ISBN "+value, true);
  14938.         } else if(property == "DOI") {                // DOI
  14939.             Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dc+"identifier", "DOI "+value, true);
  14940.         } else if(property == "publicationTitle" ||    // publicationTitle
  14941.                   property == "reporter") {            // reporter
  14942.             Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dc+"title", value, true);
  14943.         } else if(property == "journalAbbreviation") {    // journalAbbreviation
  14944.             Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.dcterms+"alternative", value, true);
  14945.         } else if(property == "volume") {            // volume
  14946.             Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.prism+"volume", value, true);
  14947.         } else if(property == "issue" ||            // issue
  14948.                   property == "number" ||            // number
  14949.                   property == "patentNumber") {        // patentNumber
  14950.             Zotero.RDF.addStatement((containerElement ? containerElement : resource), n.prism+"number", value, true);
  14951.         } else if(property == "callNumber") {
  14952.             var term = Zotero.RDF.newResource();
  14953.             // set term type
  14954.             Zotero.RDF.addStatement(term, rdf+"type", n.dcterms+"LCC", false);
  14955.             // set callNumber value
  14956.             Zotero.RDF.addStatement(term, rdf+"value", value, true);
  14957.             // add relationship to resource
  14958.             Zotero.RDF.addStatement(resource, n.dc+"subject", term, false);
  14959.         } else if(property == "abstractNote") {
  14960.             Zotero.RDF.addStatement(resource, n.dcterms+"abstract", value, true);
  14961.         // THE FOLLOWING ARE ALL PART OF THE SERIES
  14962.         } else if(property == "series") {            // series
  14963.             Zotero.RDF.addStatement(series, n.dc+"title", value, true);
  14964.         } else if(property == "seriesTitle") {        // seriesTitle
  14965.             Zotero.RDF.addStatement(series, n.dcterms+"alternative", value, true);
  14966.         } else if(property == "seriesText") {        // seriesText
  14967.             Zotero.RDF.addStatement(series, n.dc+"description", value, true);
  14968.         } else if(property == "seriesNumber") {        // seriesNumber
  14969.             Zotero.RDF.addStatement(series, n.dc+"identifier", value, true);
  14970.         // THE FOLLOWING ARE ALL PART OF THE PUBLISHER
  14971.         } else if(property == "publisher" ||        // publisher
  14972.                   property == "distributor" ||        // distributor (film)
  14973.                   property == "label" ||            // label (audioRecording)
  14974.                   property == "company" ||            // company (computerProgram)
  14975.                   property == "institution") {        // institution (report)
  14976.             Zotero.RDF.addStatement(organization, n.foaf+"name", value, true);
  14977.         } else if(property == "place") {            // place
  14978.             var address = Zotero.RDF.newResource();
  14979.             // set address type
  14980.             Zotero.RDF.addStatement(address, rdf+"type", n.vcard+"Address", false);
  14981.             // set address locality
  14982.             Zotero.RDF.addStatement(address, n.vcard+"locality", value, true);
  14983.             // add relationship to organization
  14984.             Zotero.RDF.addStatement(organization, n.vcard+"adr", address, false);
  14985.         } else if(property == "archiveLocation") {    // archiveLocation
  14986.             Zotero.RDF.addStatement(resource, n.dc+"coverage", value, true);
  14987.         } else if(property == "interviewMedium" ||
  14988.                   property == "artworkMedium") {    // medium
  14989.             Zotero.RDF.addStatement(resource, n.dcterms+"medium", value, true);
  14990.         } else if(property == "conferenceName") {
  14991.             var conference = Zotero.RDF.newResource();
  14992.             // set conference type
  14993.             Zotero.RDF.addStatement(conference, rdf+"type", n.bib+"Conference", false);
  14994.             // set conference title
  14995.             Zotero.RDF.addStatement(conference, n.dc+"title", value, true);
  14996.             // add relationship to conference
  14997.             Zotero.RDF.addStatement(resource, n.bib+"presentedAt", conference, false);
  14998.         } else if(typeProperties.indexOf(property) != -1) {
  14999.             Zotero.RDF.addStatement(resource, n.dc+"type", value, true);
  15000.         // THE FOLLOWING RELATE TO NOTES
  15001.         } else if(property == "note") {
  15002.             if(Zotero.getOption("exportNotes")) {
  15003.                 if(item.itemType == "attachment") {
  15004.                     Zotero.RDF.addStatement(resource, n.dc+"description", value, true);
  15005.                 } else if(item.itemType == "note") {
  15006.                     Zotero.RDF.addStatement(resource, rdf+"value", value, true);
  15007.                 }
  15008.             }
  15009.         // THIS CATCHES ALL REMAINING PROPERTIES
  15010.         } else if(ignoreProperties.indexOf(property) == -1) {
  15011.             Zotero.debug("Zotero RDF: using Zotero namespace for property "+property);
  15012.             Zotero.RDF.addStatement(resource, n.z+property, value, true);
  15013.         }
  15014.     }
  15015. }
  15016.  
  15017. function doExport() {
  15018.     // add namespaces
  15019.     for(var i in n) {
  15020.         Zotero.RDF.addNamespace(i, n[i]);
  15021.     }
  15022.     
  15023.     // leave as global
  15024.     itemResources = new Array();
  15025.     
  15026.     // keep track of resources already assigned (in case two book items have the
  15027.     // same ISBN, or something like that)
  15028.     var usedResources = new Array();
  15029.     
  15030.     var items = new Array();
  15031.     
  15032.     // first, map each ID to a resource
  15033.     while(item = Zotero.nextItem()) {
  15034.         items.push(item);
  15035.         
  15036.         if(item.ISBN && !usedResources["urn:isbn:"+item.ISBN]) {
  15037.             itemResources[item.itemID] = "urn:isbn:"+item.ISBN;
  15038.             usedResources[itemResources[item.itemID]] = true;
  15039.         } else if(item.itemType != "attachment" && item.url && !usedResources[item.url]) {
  15040.             itemResources[item.itemID] = item.url;
  15041.             usedResources[itemResources[item.itemID]] = true;
  15042.         } else {
  15043.             // just specify a node ID
  15044.             itemResources[item.itemID] = "#item_"+item.itemID;
  15045.         }
  15046.         
  15047.         for(var j in item.notes) {
  15048.             itemResources[item.notes[j].itemID] = "#item_"+item.notes[j].itemID;
  15049.         }
  15050.         
  15051.         for each(var attachment in item.attachments) {
  15052.             // just specify a node ID
  15053.             itemResources[attachment.itemID] = "#item_"+attachment.itemID;
  15054.         }
  15055.     }
  15056.     
  15057.     for each(item in items) {
  15058.         // these items are global
  15059.         generateItem(item, item.itemType, itemResources[item.itemID]);
  15060.     }
  15061.     
  15062.     /** RDF COLLECTION STRUCTURE **/
  15063.     var collection;
  15064.     while(collection = Zotero.nextCollection()) {
  15065.         generateCollection(collection);
  15066.     }
  15067. }');
  15068.  
  15069. REPLACE INTO translators VALUES ('6e372642-ed9d-4934-b5d1-c11ac758ebb7', '1.0.0b3.r1', '', '2006-10-02 17:00:00', 1, 100, 2, 'Unqualified Dublin Core RDF', 'Simon Kornblith', 'rdf',
  15070. 'Zotero.configure("dataMode", "rdf");',
  15071. 'function doExport() {
  15072.     var dc = "http://purl.org/dc/elements/1.1/";
  15073.     Zotero.RDF.addNamespace("dc", dc);
  15074.     
  15075.     var item;
  15076.     while(item = Zotero.nextItem()) {
  15077.         if(item.itemType == "note" || item.itemType == "attachment") {
  15078.             continue;
  15079.         }
  15080.         
  15081.         var resource;
  15082.         if(item.ISBN) {
  15083.             resource = "urn:isbn:"+item.ISBN;
  15084.         } else if(item.url) {
  15085.             resource = item.url;
  15086.         } else {
  15087.             // just specify a node ID
  15088.             resource = Zotero.RDF.newResource();
  15089.         }
  15090.         
  15091.         /** CORE FIELDS **/
  15092.         
  15093.         // title
  15094.         if(item.title) {
  15095.             Zotero.RDF.addStatement(resource, dc+"title", item.title, true);
  15096.         }
  15097.         
  15098.         // type
  15099.         Zotero.RDF.addStatement(resource, dc+"type", item.itemType, true);
  15100.         
  15101.         // creators
  15102.         for(var j in item.creators) {
  15103.             // put creators in lastName, firstName format (although DC doesn''t specify)
  15104.             var creator = item.creators[j].lastName;
  15105.             if(item.creators[j].firstName) {
  15106.                 creator += ", "+item.creators[j].firstName;
  15107.             }
  15108.             
  15109.             if(item.creators[j].creatorType == "author") {
  15110.                 Zotero.RDF.addStatement(resource, dc+"creator", creator, true);
  15111.             } else {
  15112.                 Zotero.RDF.addStatement(resource, dc+"contributor", creator, true);
  15113.             }
  15114.         }
  15115.         
  15116.         /** FIELDS ON NEARLY EVERYTHING BUT NOT A PART OF THE CORE **/
  15117.         
  15118.         // source
  15119.         if(item.source) {
  15120.             Zotero.RDF.addStatement(resource, dc+"source", item.source, true);
  15121.         }
  15122.         
  15123.         // accessionNumber as generic ID
  15124.         if(item.accessionNumber) {
  15125.             Zotero.RDF.addStatement(resource, dc+"identifier", item.accessionNumber, true);
  15126.         }
  15127.         
  15128.         // rights
  15129.         if(item.rights) {
  15130.             Zotero.RDF.addStatement(resource, dc+"rights", item.rights, true);
  15131.         }
  15132.         
  15133.         /** SUPPLEMENTAL FIELDS **/
  15134.         
  15135.         // TODO - create text citation and OpenURL citation to handle volume, number, pages, issue, place
  15136.         
  15137.         // publisher/distributor
  15138.         if(item.publisher) {
  15139.             Zotero.RDF.addStatement(resource, dc+"publisher", item.publisher, true);
  15140.         } else if(item.distributor) {
  15141.             Zotero.RDF.addStatement(resource, dc+"publisher", item.distributor, true);
  15142.         } else if(item.institution) {
  15143.             Zotero.RDF.addStatement(resource, dc+"publisher", item.distributor, true);
  15144.         }
  15145.         
  15146.         // date/year
  15147.         if(item.date) {
  15148.             Zotero.RDF.addStatement(resource, dc+"date", item.date, true);
  15149.         }
  15150.         
  15151.         // ISBN/ISSN/DOI
  15152.         if(item.ISBN) {
  15153.             Zotero.RDF.addStatement(resource, dc+"identifier", "ISBN "+item.ISBN, true);
  15154.         }
  15155.         if(item.ISSN) {
  15156.             Zotero.RDF.addStatement(resource, dc+"identifier", "ISSN "+item.ISSN, true);
  15157.         }
  15158.         if(item.DOI) {
  15159.             Zotero.RDF.addStatement(resource, dc+"identifier", "DOI "+item.DOI, true);
  15160.         }
  15161.         
  15162.         // callNumber
  15163.         if(item.callNumber) {
  15164.             Zotero.RDF.addStatement(resource, dc+"identifier", item.callNumber, true);
  15165.         }
  15166.         
  15167.         // archiveLocation
  15168.         if(item.archiveLocation) {
  15169.             Zotero.RDF.addStatement(resource, dc+"coverage", item.archiveLocation, true);
  15170.         }
  15171.         
  15172.         // medium
  15173.         if(item.medium) {
  15174.             Zotero.RDF.addStatement(resource, dcterms+"medium", item.medium, true);
  15175.         }
  15176.     }
  15177. }');
  15178.  
  15179. REPLACE INTO translators VALUES ('5e3ad958-ac79-463d-812b-a86a9235c28f', '1.0.0b4.r1', '', '2007-03-22 15:55:00', 1, 100, 1, 'RDF', 'Simon Kornblith', 'rdf',
  15180. 'Zotero.configure("dataMode", "rdf");
  15181.  
  15182. function detectImport() {
  15183.     // unfortunately, Mozilla will let you create a data source from any type
  15184.     // of XML, so we need to make sure there are actually nodes
  15185.     
  15186.     var nodes = Zotero.RDF.getAllResources();
  15187.     if(nodes) {
  15188.         return true;
  15189.     }
  15190. }',
  15191. 'var rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
  15192.  
  15193. var n = {
  15194.     bib:"http://purl.org/net/biblio#",
  15195.     dc:"http://purl.org/dc/elements/1.1/",
  15196.     dcterms:"http://purl.org/dc/terms/",
  15197.     prism:"http://prismstandard.org/namespaces/1.2/basic/",
  15198.     foaf:"http://xmlns.com/foaf/0.1/",
  15199.     vcard:"http://nwalsh.com/rdf/vCard#",
  15200.     link:"http://purl.org/rss/1.0/modules/link/",
  15201.     z:"http://www.zotero.org/namespaces/export#"
  15202. };
  15203.  
  15204. var callNumberTypes = [n.dcterms+"LCC", n.dcterms+"DDC", n.dcterms+"UDC"];
  15205.  
  15206. var defaultUnknownType = "book";
  15207.  
  15208. // gets the first result set for a property that can be encoded in multiple
  15209. // ontologies
  15210. function getFirstResults(node, properties, onlyOneString) {
  15211.     for(var i=0; i<properties.length; i++) {
  15212.         var result = Zotero.RDF.getTargets(node, properties[i]);
  15213.         if(result) {
  15214.             if(onlyOneString) {
  15215.                 // onlyOneString means we won''t return nsIRDFResources, only
  15216.                 // actual literals
  15217.                 if(typeof(result[0]) != "object") {
  15218.                     return result[0];
  15219.                 }
  15220.             } else {
  15221.                 return result;
  15222.             }
  15223.         }
  15224.     }
  15225.     return;    // return undefined on failure
  15226. }
  15227.  
  15228. // adds creators to an item given a list of creator nodes
  15229. function handleCreators(newItem, creators, creatorType) {
  15230.     if(!creators) {
  15231.         return;
  15232.     }
  15233.     
  15234.     if(typeof(creators[0]) != "string") {    // see if creators are in a container
  15235.         try {
  15236.             var creators = Zotero.RDF.getContainerElements(creators[0]);
  15237.         } catch(e) {}
  15238.     }
  15239.     
  15240.     if(typeof(creators[0]) == "string") {    // support creators encoded as strings
  15241.         for(var i in creators) {
  15242.             if(typeof(creators[i]) != "object") {
  15243.                 newItem.creators.push(Zotero.Utilities.cleanAuthor(creators[i], creatorType, true));
  15244.             }
  15245.         }
  15246.     } else {                                // also support foaf
  15247.         for(var i in creators) {
  15248.             var type = Zotero.RDF.getTargets(creators[i], rdf+"type");
  15249.             if(type) {
  15250.                 type = Zotero.RDF.getResourceURI(type[0]);
  15251.                 if(type == n.foaf+"Person") {    // author is FOAF type person
  15252.                     var creator = new Array();
  15253.                     creator.lastName = getFirstResults(creators[i],
  15254.                         [n.foaf+"surname", n.foaf+"family_name"], true);
  15255.                     creator.firstName = getFirstResults(creators[i],
  15256.                         [n.foaf+"givenname", n.foaf+"firstName"], true);
  15257.                     creator.creatorType = creatorType;
  15258.                     newItem.creators.push(creator);
  15259.                 }
  15260.             }
  15261.         }
  15262.     }
  15263. }
  15264.  
  15265. // processes collections recursively
  15266. function processCollection(node, collection) {
  15267.     if(!collection) {
  15268.         collection = new Array();
  15269.     }
  15270.     collection.type = "collection";
  15271.     collection.name = getFirstResults(node, [n.dc+"title"], true);
  15272.     collection.children = new Array();
  15273.     
  15274.     // check for children
  15275.     var children = getFirstResults(node, [n.dcterms+"hasPart"]);
  15276.     for each(var child in children) {
  15277.         var type = Zotero.RDF.getTargets(child, rdf+"type");
  15278.         if(type) {
  15279.             type = Zotero.RDF.getResourceURI(type[0]);
  15280.         }
  15281.         
  15282.         if(type == n.bib+"Collection" || type == n.z+"Collection") {
  15283.             // for collections, process recursively
  15284.             collection.children.push(processCollection(child));
  15285.         } else {
  15286.             // all other items are added by ID
  15287.             collection.children.push({id:Zotero.RDF.getResourceURI(child), type:"item"});
  15288.         }
  15289.     }
  15290.     
  15291.     return collection;
  15292. }
  15293.  
  15294. function processSeeAlso(node, newItem) {
  15295.     var relations;
  15296.     newItem.itemID = Zotero.RDF.getResourceURI(node);
  15297.     newItem.seeAlso = new Array();
  15298.     if(relations = getFirstResults(node, [n.dc+"relation"])) {
  15299.         for each(var relation in relations) {
  15300.             newItem.seeAlso.push(Zotero.RDF.getResourceURI(relation));
  15301.         }
  15302.     }
  15303. }
  15304.  
  15305. function processTags(node, newItem) {
  15306.     var subjects;
  15307.     newItem.tags = new Array();
  15308.     if(subjects = getFirstResults(node, [n.dc+"subject"])) {
  15309.         for each(var subject in subjects) {
  15310.             if(typeof(subject) == "string") {    // a regular tag
  15311.                 newItem.tags.push(subject);
  15312.             } else {
  15313.                 // a call number
  15314.                 var type = Zotero.RDF.getTargets(subject, rdf+"type");
  15315.                 if(type) {
  15316.                     type = Zotero.RDF.getResourceURI(type[0]);
  15317.                     if(type == n.z+"AutomaticTag") {
  15318.                         newItem.tags.push({tag:getFirstResults(subject, [rdf+"value"], true), type:1});
  15319.                     }
  15320.                 }
  15321.             }
  15322.         }
  15323.     }
  15324. }
  15325.  
  15326. // gets the node with a given type from an array
  15327. function getNodeByType(nodes, type) {
  15328.     if(!nodes) {
  15329.         return false;
  15330.     }
  15331.     
  15332.     for each(var node in nodes) {
  15333.         var nodeType = Zotero.RDF.getTargets(node, rdf+"type");
  15334.         if(nodeType) {
  15335.             nodeType = Zotero.RDF.getResourceURI(nodeType[0]);
  15336.             if(nodeType == type) {    // we have a node of the correct type
  15337.                 return node;
  15338.             }
  15339.         }
  15340.     }
  15341.     return false;
  15342. }
  15343.  
  15344. // returns true if this resource is part of another (related by any arc besides
  15345. // dc:relation or dcterms:hasPart)
  15346. //
  15347. // used to differentiate independent notes and files
  15348. function isPart(node) {
  15349.     var arcs = Zotero.RDF.getArcsIn(node);
  15350.     var skip = false;
  15351.     for each(var arc in arcs) {
  15352.         arc = Zotero.RDF.getResourceURI(arc);
  15353.         if(arc != n.dc+"relation" && arc != n.dcterms+"hasPart") {    
  15354.             // related to another item by some arc besides see also
  15355.             skip = true;
  15356.         }
  15357.     }
  15358.     return skip;
  15359. }
  15360.  
  15361. function importItem(newItem, node, type) {
  15362.     var container = undefined;
  15363.     
  15364.     // also deal with type detection based on parts, so we can differentiate
  15365.     // magazine and journal articles, and find container elements
  15366.     var isPartOf = getFirstResults(node, [n.dcterms+"isPartOf"]);
  15367.     
  15368.     // get parts of parts, because parts are sections of wholes.
  15369.     if(isPartOf) {
  15370.         for(var i=0; i<isPartOf.length; i++) {
  15371.             var subParts = getFirstResults(isPartOf[i], [n.dcterms+"isPartOf"]);
  15372.             if(subParts) {
  15373.                 isPartOf = isPartOf.concat(subParts);
  15374.             }
  15375.         }
  15376.     }
  15377.     
  15378.     if(type) {
  15379.         if(type == n.bib+"Book") {
  15380.             newItem.itemType = "book";
  15381.         } else if(type == n.bib+"BookSection") {
  15382.             newItem.itemType = "bookSection";
  15383.             container = getNodeByType(isPartOf, n.bib+"Book");
  15384.         } else if(type == n.bib+"Article") {    // choose between journal,
  15385.                                                 // newspaper, and magazine
  15386.                                                 // articles
  15387.             // use of container = (not container ==) is intentional
  15388.             if(container = getNodeByType(isPartOf, n.bib+"Journal")) {
  15389.                 newItem.itemType = "journalArticle";
  15390.             } else if(container = getNodeByType(isPartOf, n.bib+"Periodical")) {
  15391.                 newItem.itemType = "magazineArticle";
  15392.             } else if(container = getNodeByType(isPartOf, n.bib+"Newspaper")) {
  15393.                 newItem.itemType = "newspaperArticle";
  15394.             }
  15395.         } else if(type == n.bib+"Thesis") {
  15396.             newItem.itemType = "thesis";
  15397.         } else if(type == n.bib+"Letter") {
  15398.             newItem.itemType = "letter";
  15399.         } else if(type == n.bib+"Manuscript") {
  15400.             newItem.itemType = "manuscript";
  15401.         } else if(type == n.bib+"Interview") {
  15402.             newItem.itemType = "interview";
  15403.         } else if(type == n.bib+"MotionPicture") {
  15404.             newItem.itemType = "film";
  15405.         } else if(type == n.bib+"Illustration") {
  15406.             newItem.itemType = "artwork";
  15407.         } else if(type == n.bib+"Document") {
  15408.             if(container = getNodeByType(isPartOf, n.bib+"CourtReporter")) {
  15409.                 newItem.itemType = "case";
  15410.             } else {
  15411.                 newItem.itemType = "webpage";
  15412.             }
  15413.         } else if(type == n.bib+"Memo") {
  15414.             newItem.itemType = "note";
  15415.         } else if(type == n.z+"Attachment") {
  15416.             // unless processing of independent attachment is intended, don''t
  15417.             // process
  15418.             
  15419.             // process as file
  15420.             newItem.itemType = "attachment";
  15421.  
  15422.             var path = getFirstResults(node, [rdf+"resource"]);
  15423.             if(path) {
  15424.                 newItem.path = Zotero.RDF.getResourceURI(path[0]);
  15425.             }
  15426.             newItem.charset = getFirstResults(node, [n.link+"charset"], true);
  15427.             newItem.mimeType = getFirstResults(node, [n.link+"type"], true);
  15428.         } else if(type == n.bib+"Report") {
  15429.             newItem.itemType = "report";
  15430.         } else if(type == n.bib+"Legislation") {
  15431.             newItem.itemType = "statute";
  15432.         } else if(type == n.bib+"Patent") {
  15433.             newItem.itemType = "patent";
  15434.         } else if(type == n.bib+"Image") {
  15435.             newItem.itemType = "artwork";
  15436.         } else if(type == n.bib+"Recording") {
  15437.             newItem.itemType = "audioRecording";
  15438.         }
  15439.     }
  15440.     
  15441.     // check to see if we recognize the type in the fs or dc namespaces
  15442.     var zoteroType = getFirstResults(node, [n.z+"itemType", n.z+"type", n.dc+"type"], true);
  15443.     if(Zotero.Utilities.itemTypeExists(zoteroType)) {
  15444.         newItem.itemType = zoteroType;
  15445.     }
  15446.     
  15447.     if(newItem.itemType == "blogPost") {
  15448.         container = getNodeByType(isPartOf, n.z+"Blog");
  15449.     } else if(newItem.itemType == "forumPost") {
  15450.         container = getNodeByType(isPartOf, n.z+"Forum");
  15451.     } else if(newItem.itemType == "webpage") {
  15452.         container = getNodeByType(isPartOf, n.z+"Website");
  15453.     }
  15454.     
  15455.     // title
  15456.     newItem.title = getFirstResults(node, [n.dc+"title"], true);
  15457.     if(!newItem.itemType && !newItem.title) {            // require the title
  15458.                                                         // (if not a known type)
  15459.         return false;
  15460.     }
  15461.     
  15462.     if(!newItem.itemType) {
  15463.         newItem.itemType = defaultUnknownType;
  15464.     }
  15465.     
  15466.     // regular author-type creators
  15467.     var possibleCreatorTypes = Zotero.Utilities.getCreatorsForType(newItem.itemType);
  15468.     for each(var creatorType in possibleCreatorTypes) {
  15469.         if(creatorType == "author") {
  15470.             var creators = getFirstResults(node, [n.bib+"authors", n.dc+"creator"]);
  15471.         } else if(creatorType == "editor" || creatorType == "contributor") {
  15472.             var creators = getFirstResults(node, [n.bib+creatorType+"s"]);
  15473.         } else {
  15474.             var creators = getFirstResults(node, [n.z+creatorType+"s"]);
  15475.         }
  15476.         
  15477.         if(creators) handleCreators(newItem, creators, creatorType);
  15478.     }
  15479.     
  15480.     // source
  15481.     newItem.source = getFirstResults(node, [n.dc+"source"], true);
  15482.     
  15483.     // rights
  15484.     newItem.rights = getFirstResults(node, [n.dc+"rights"], true);
  15485.     
  15486.     // section
  15487.     var section = getNodeByType(isPartOf, n.bib+"Part");
  15488.     if(section) {
  15489.         newItem.section = getFirstResults(section, [n.dc+"title"], true);
  15490.     }
  15491.     
  15492.     // publication
  15493.     if(container) {
  15494.         newItem.publicationTitle = getFirstResults(container, [n.dc+"title"], true);
  15495.         // these fields mean the same thing
  15496.         newItem.reporter = newItem.publicationTitle;
  15497.     }
  15498.     
  15499.     // series
  15500.     var series = getNodeByType(isPartOf, n.bib+"Series");
  15501.     if(series) {
  15502.         newItem.series = getFirstResults(series, [n.dc+"title"], true);
  15503.         newItem.seriesTitle = getFirstResults(series, [n.dcterms+"alternative"], true);
  15504.         newItem.seriesText = getFirstResults(series, [n.dc+"description"], true);
  15505.         newItem.seriesNumber = getFirstResults(series, [n.dc+"identifier"], true);
  15506.     }
  15507.     
  15508.     // volume
  15509.     newItem.volume = getFirstResults((container ? container : node), [n.prism+"volume"], true);
  15510.     
  15511.     // issue
  15512.     newItem.issue = getFirstResults((container ? container : node), [n.prism+"number"], true);
  15513.     // these mean the same thing
  15514.     newItem.patentNumber = newItem.number = newItem.issue;
  15515.     
  15516.     // edition
  15517.     newItem.edition = getFirstResults(node, [n.prism+"edition"], true);
  15518.     // these fields mean the same thing
  15519.     newItem.version = newItem.edition;
  15520.     
  15521.     // pages
  15522.     newItem.pages = getFirstResults(node, [n.bib+"pages"], true);
  15523.     
  15524.     // mediums
  15525.     newItem.artworkMedium = newItem.interviewMedium = getFirstResults(node, [n.dcterms+"medium"], true);
  15526.     
  15527.     // publisher
  15528.     var publisher = getFirstResults(node, [n.dc+"publisher"]);
  15529.     if(publisher) {
  15530.         if(typeof(publisher[0]) == "string") {
  15531.             newItem.publisher = publisher[0];
  15532.         } else {
  15533.             var type = Zotero.RDF.getTargets(publisher[0], rdf+"type");
  15534.             if(type) {
  15535.                 type = Zotero.RDF.getResourceURI(type[0]);
  15536.                 if(type == n.foaf+"Organization") {    // handle foaf organizational publishers
  15537.                     newItem.publisher = getFirstResults(publisher[0], [n.foaf+"name"], true);
  15538.                     var place = getFirstResults(publisher[0], [n.vcard+"adr"]);
  15539.                     if(place) {
  15540.                         newItem.place = getFirstResults(place[0], [n.vcard+"locality"]);
  15541.                     }
  15542.                 }
  15543.             }
  15544.         }
  15545.     }
  15546.     
  15547.     // these fields mean the same thing
  15548.     newItem.distributor = newItem.label = newItem.company = newItem.institution = newItem.publisher;
  15549.     
  15550.     // date
  15551.     newItem.date = getFirstResults(node, [n.dc+"date"], true);
  15552.     // accessDate
  15553.     newItem.accessDate = getFirstResults(node, [n.dcterms+"dateSubmitted"], true);
  15554.     // issueDate
  15555.     newItem.issueDate = getFirstResults(node, [n.dcterms+"issued"], true);
  15556.     // lastModified
  15557.     newItem.lastModified = getFirstResults(node, [n.dcterms+"modified"], true);
  15558.     
  15559.     // identifier
  15560.     var identifiers = getFirstResults(node, [n.dc+"identifier"]);
  15561.     if(container) {
  15562.         var containerIdentifiers = getFirstResults(container, [n.dc+"identifier"]);
  15563.         // concatenate sets of identifiers
  15564.         if(containerIdentifiers) {
  15565.             if(identifiers) {
  15566.                 identifiers = identifiers.concat(containerIdentifiers);
  15567.             } else {
  15568.                 identifiers = containerIdentifiers;
  15569.             }
  15570.         }
  15571.     }
  15572.     
  15573.     if(identifiers) {
  15574.         for(var i in identifiers) {
  15575.             if(typeof(identifiers[i]) == "string") {
  15576.                 // grab other things
  15577.                 var beforeSpace = identifiers[i].substr(0, identifiers[i].indexOf(" ")).toUpperCase();
  15578.                 
  15579.                 if(beforeSpace == "ISBN") {
  15580.                     newItem.ISBN = identifiers[i].substr(5).toUpperCase();
  15581.                 } else if(beforeSpace == "ISSN") {
  15582.                     newItem.ISSN = identifiers[i].substr(5).toUpperCase();
  15583.                 } else if(beforeSpace == "DOI") {
  15584.                     newItem.DOI = identifiers[i].substr(4);
  15585.                 } else if(!newItem.accessionNumber) {
  15586.                     newItem.accessionNumber = identifiers[i];
  15587.                 }
  15588.             } else {
  15589.                 // grab URLs
  15590.                 var type = Zotero.RDF.getTargets(identifiers[i], rdf+"type");
  15591.                 if(type && (type = Zotero.RDF.getResourceURI(type[0])) && type == n.dcterms+"URI") {
  15592.                     newItem.url = getFirstResults(identifiers[i], [rdf+"value"], true);
  15593.                 }
  15594.             }
  15595.         }
  15596.     }
  15597.     
  15598.     // archiveLocation
  15599.     newItem.archiveLocation = getFirstResults(node, [n.dc+"coverage"], true);
  15600.     
  15601.     // abstract
  15602.     newItem.abstractNote = getFirstResults(node, [n.dcterms+"abstract"], true);
  15603.     
  15604.     // type
  15605.     var type = getFirstResults(node, [n.dc+"type"], true);
  15606.     // these all mean the same thing
  15607.     var typeProperties = ["reportType", "videoRecordingType", "letterType",
  15608.                         "manuscriptType", "mapType", "thesisType", "websiteType",
  15609.                         "audioRecordingType", "presentationType", "postType",
  15610.                         "audioFileType"];
  15611.     for each(var property in typeProperties) {
  15612.         newItem[property] = type;
  15613.     }
  15614.     
  15615.     // conferenceName
  15616.     var conference = getFirstResults(node, [n.bib+"presentedAt"]);
  15617.     if(conference) {
  15618.         conference = conference[0];
  15619.         if(typeof(conference) == "string") {
  15620.             newItem.conferenceName = conference;
  15621.         } else {
  15622.             newItem.conferenceName = getFirstResults(conference, [n.dc+"title"], true);
  15623.         }
  15624.     }
  15625.     
  15626.     // journalAbbreviation
  15627.     newItem.journalAbbreviation = getFirstResults((container ? container : node), [n.dcterms+"alternative"], true);
  15628.     
  15629.     // see also
  15630.     processSeeAlso(node, newItem);
  15631.     
  15632.     // description/attachment note
  15633.     if(newItem.itemType == "attachment") {
  15634.         newItem.note = getFirstResults(node, [n.dc+"description"], true);
  15635.     } else {
  15636.         newItem.extra = getFirstResults(node, [n.dc+"description"], true);
  15637.     }
  15638.     
  15639.     /** NOTES **/
  15640.     
  15641.     var referencedBy = Zotero.RDF.getTargets(node, n.dcterms+"isReferencedBy");
  15642.     for each(var referentNode in referencedBy) {
  15643.         var type = Zotero.RDF.getTargets(referentNode, rdf+"type");
  15644.         if(type && Zotero.RDF.getResourceURI(type[0]) == n.bib+"Memo") {
  15645.             // if this is a memo
  15646.             var note = new Array();
  15647.             note.note = getFirstResults(referentNode, [rdf+"value", n.dc+"description"], true);
  15648.             if(note.note != undefined) {
  15649.                 // handle see also
  15650.                 processSeeAlso(referentNode, note);
  15651.                 processTags(referentNode, note);
  15652.                 
  15653.                 // add note
  15654.                 newItem.notes.push(note);
  15655.             }
  15656.         }
  15657.     }
  15658.     
  15659.     if(newItem.itemType == "note") {
  15660.         // add note for standalone
  15661.         newItem.note = getFirstResults(node, [rdf+"value", n.dc+"description"], true);
  15662.     }
  15663.     
  15664.     /** TAGS **/
  15665.     
  15666.     var subjects = getFirstResults(node, [n.dc+"subject"]);
  15667.     for each(var subject in subjects) {
  15668.         if(typeof(subject) == "string") {    // a regular tag
  15669.             newItem.tags.push(subject);
  15670.         } else {                            // a call number or automatic tag
  15671.             var type = Zotero.RDF.getTargets(subject, rdf+"type");
  15672.             if(type) {
  15673.                 type = Zotero.RDF.getResourceURI(type[0]);
  15674.                 if(Zotero.Utilities.inArray(type, callNumberTypes)) {
  15675.                     newItem.callNumber = getFirstResults(subject, [rdf+"value"], true);
  15676.                 } else if(type == n.z+"AutomaticTag") {
  15677.                     newItem.tags.push({tag:getFirstResults(subject, [rdf+"value"], true), type:1});
  15678.                 }
  15679.             }
  15680.         }
  15681.     }
  15682.     
  15683.     /** ATTACHMENTS **/
  15684.     var relations = getFirstResults(node, [n.link+"link"]);
  15685.     for each(var relation in relations) {            
  15686.         var type = Zotero.RDF.getTargets(relation, rdf+"type");
  15687.         if(Zotero.RDF.getResourceURI(type[0]) == n.z+"Attachment") {
  15688.             var attachment = new Zotero.Item();
  15689.             newItem.attachments.push(attachment);
  15690.             importItem(attachment, relation, n.z+"Attachment");
  15691.         }
  15692.     }
  15693.     
  15694.     /** OTHER FIELDS **/
  15695.     var arcs = Zotero.RDF.getArcsOut(node);
  15696.     for each(var arc in arcs) {
  15697.         var uri = Zotero.RDF.getResourceURI(arc);
  15698.         if(uri.substr(0, n.z.length) == n.z) {
  15699.             var property = uri.substr(n.z.length);
  15700.             newItem[property] = Zotero.RDF.getTargets(node, n.z+property)[0];
  15701.         }
  15702.     }
  15703.     
  15704.     return true;
  15705. }
  15706.  
  15707. function doImport() {
  15708.     var nodes = Zotero.RDF.getAllResources();
  15709.     if(!nodes) {
  15710.         return false;
  15711.     }
  15712.     
  15713.     // keep track of collections while we''re looping through
  15714.     var collections = new Array();
  15715.     
  15716.     for each(var node in nodes) {
  15717.         var newItem = new Zotero.Item();
  15718.         newItem.itemID = Zotero.RDF.getResourceURI(node);
  15719.         
  15720.         // figure out if this is a part of another resource, or a linked
  15721.         // attachment
  15722.         if(Zotero.RDF.getSources(node, n.dcterms+"isPartOf") ||
  15723.            Zotero.RDF.getSources(node, n.bib+"presentedAt") ||
  15724.            Zotero.RDF.getSources(node, n.link+"link")) {
  15725.             continue;
  15726.         }
  15727.         
  15728.         // type
  15729.         var type = Zotero.RDF.getTargets(node, rdf+"type");
  15730.         if(type) {
  15731.             type = Zotero.RDF.getResourceURI(type[0]);
  15732.             
  15733.             // skip if this is not an independent attachment,
  15734.             if((type == n.z+"Attachment" || type == n.bib+"Memo") && isPart(node)) {
  15735.                 continue;
  15736.             } else if(type == n.bib+"Collection" || type == n.z+"Collection") {
  15737.                 // skip collections until all the items are done
  15738.                 collections.push(node);
  15739.                 continue;
  15740.             }
  15741.         } else {
  15742.             type = false;
  15743.         }
  15744.         
  15745.         if(importItem(newItem, node, type)) {
  15746.             newItem.complete();
  15747.         }
  15748.     }
  15749.     
  15750.     /* COLLECTIONS */
  15751.     
  15752.     for each(var collection in collections) {
  15753.         if(!Zotero.RDF.getArcsIn(collection)) {
  15754.             var newCollection = new Zotero.Collection();
  15755.             processCollection(collection, newCollection);
  15756.             newCollection.complete();
  15757.         }
  15758.     }
  15759. }');
  15760.  
  15761. REPLACE INTO translators VALUES ('32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7', '1.0.2', '', '2008-01-04 02:47:18', '1', '100', '3', 'RIS', 'Simon Kornblith', 'ris', 
  15762. 'Zotero.configure("dataMode", "line");
  15763. Zotero.addOption("exportNotes", true);
  15764.  
  15765. function detectImport() {
  15766.     var line;
  15767.     var i = 0;
  15768.     while((line = Zotero.read()) !== "false") {
  15769.         line = line.replace(/^\s+/, "");
  15770.         if(line != "") {
  15771.             if(line.substr(0, 6) == "TY  - ") {
  15772.                 return true;
  15773.             } else {
  15774.                 if(i++ > 3) {
  15775.                     return false;
  15776.                 }
  15777.             }
  15778.         }
  15779.     }
  15780. }', 
  15781. 'var fieldMap = {
  15782.     ID:"itemID",
  15783.     T1:"title",
  15784.     T3:"series",
  15785.     JF:"publicationTitle",
  15786.     CP:"place",
  15787.     JA:"journalAbbreviation",
  15788.     M3:"DOI"
  15789. };
  15790.  
  15791. var inputFieldMap = {
  15792.     TI:"title",
  15793.     CT:"title",
  15794.     CY:"place"
  15795. };
  15796.  
  15797. // TODO: figure out if these are the best types for letter, interview, webpage
  15798. var typeMap = {
  15799.     book:"BOOK",
  15800.     bookSection:"CHAP",
  15801.     journalArticle:"JOUR",
  15802.     magazineArticle:"MGZN",
  15803.     newspaperArticle:"NEWS",
  15804.     thesis:"THES",
  15805.     letter:"PCOMM",
  15806.     manuscript:"PAMP",
  15807.     interview:"PCOMM",
  15808.     film:"MPCT",
  15809.     artwork:"ART",
  15810.     report:"RPRT",
  15811.     bill:"BILL",
  15812.     case:"CASE",
  15813.     hearing:"HEAR",
  15814.     patent:"PAT",
  15815.     statute:"STAT",
  15816.     map:"MAP",
  15817.     blogPost:"ELEC",
  15818.     webpage:"ELEC",
  15819.     instantMessage:"ICOMM",
  15820.     forumPost:"ICOMM",
  15821.     email:"ICOMM",
  15822.     audioRecording:"SOUND",
  15823.     presentation:"GEN",
  15824.     videoRecording:"VIDEO",
  15825.     tvBroadcast:"GEN",
  15826.     radioBroadcast:"GEN",
  15827.     podcast:"GEN",
  15828.     computerProgram:"COMP",
  15829.     conferencePaper:"CONF",
  15830.     document:"GEN"
  15831. };
  15832.  
  15833. // supplements outputTypeMap for importing
  15834. // TODO: DATA, MUSIC
  15835. var inputTypeMap = {
  15836.     ABST:"journalArticle",
  15837.     ADVS:"film",
  15838.     CTLG:"magazineArticle",
  15839.     INPR:"manuscript",
  15840.     JFULL:"journalArticle",
  15841.     PAMP:"manuscript",
  15842.     SER:"book",
  15843.     SLIDE:"artwork",
  15844.     UNBILL:"manuscript"
  15845. };
  15846.  
  15847. function processTag(item, tag, value) {
  15848.     if (Zotero.Utilities.unescapeHTML) {
  15849.         value = Zotero.Utilities.unescapeHTML(value);
  15850.     }
  15851.     
  15852.     if(fieldMap[tag]) {
  15853.         item[fieldMap[tag]] = value;
  15854.     } else if(inputFieldMap[tag]) {
  15855.         item[inputFieldMap[tag]] = value;
  15856.     } else if(tag == "TY") {
  15857.         // look for type
  15858.  
  15859.         // first check typeMap
  15860.         for(var i in typeMap) {
  15861.             if(value == typeMap[i]) {
  15862.                 item.itemType = i;
  15863.             }
  15864.         }
  15865.         // then check inputTypeMap
  15866.         if(!item.itemType) {
  15867.             if(inputTypeMap[value]) {
  15868.                 item.itemType = inputTypeMap[value];
  15869.             } else {
  15870.                 // default to generic from inputTypeMap
  15871.                 item.itemType = inputTypeMap["GEN"];
  15872.             }
  15873.         }
  15874.     } else if(tag == "JO") {
  15875.         if (item.itemType == "conferencePaper"){
  15876.             item.conferenceName = value;
  15877.         } else {
  15878.             item.publicationTitle = value;
  15879.         }
  15880.     } else if(tag == "BT") {
  15881.         // ignore, unless this is a book or unpublished work, as per spec
  15882.         if(item.itemType == "book" || item.itemType == "manuscript") {
  15883.             item.title = value;
  15884.         } else {
  15885.             item.backupPublicationTitle = value;
  15886.         }
  15887.     } else if(tag == "T2") {
  15888.         item.backupPublicationTitle = value;
  15889.     } else if(tag == "A1" || tag == "AU") {
  15890.         // primary author (patent: inventor)
  15891.         // store Zotero "creator type" in temporary variable
  15892.         var tempType;
  15893.         if (item.itemType == "patent") {
  15894.             tempType = "inventor";
  15895.         } else {
  15896.             tempType = "author";
  15897.         }
  15898.         var names = value.split(/, ?/);
  15899.         item.creators.push({lastName:names[0], firstName:names[1], creatorType:tempType});
  15900.     } else if(tag == "A2" || tag == "ED") {
  15901.         // contributing author (patent: assignee)
  15902.         if (item.itemType == "patent") {
  15903.             if (item.assignee) {
  15904.                 // Patents can have multiple assignees (applicants) but Zotero only allows a single
  15905.                 // assignee field, so we  have to concatenate them together
  15906.                 item.assignee += ", "+value;
  15907.             } else {
  15908.                 item.assignee =  value;
  15909.             }
  15910.         } else {
  15911.             var names = value.split(/, ?/);
  15912.             item.creators.push({lastName:names[0], firstName:names[1], creatorType:"contributor"});
  15913.         }
  15914.     } else if(tag == "Y1" || tag == "PY") {
  15915.         // year or date
  15916.         var dateParts = value.split("/");
  15917.  
  15918.         if(dateParts.length == 1) {
  15919.             // technically, if there''s only one date part, the file isn''t valid
  15920.             // RIS, but EndNote writes this, so we have to too
  15921.             // Nick: RIS spec example records also only contain a single part
  15922.             // even though it says the slashes are not optional (?)
  15923.             item.date = value;
  15924.         } else {
  15925.             // in the case that we have a year and other data, format that way
  15926.  
  15927.             var month = parseInt(dateParts[1]);
  15928.             if(month) {
  15929.                 month--;
  15930.             } else {
  15931.                 month = undefined;
  15932.             }
  15933.  
  15934.             item.date = Zotero.Utilities.formatDate({year:dateParts[0],
  15935.                                   month:month,
  15936.                                   day:dateParts[2],
  15937.                                   part:dateParts[3]});
  15938.         }
  15939.     } else if(tag == "Y2") {
  15940.         // the secondary date field can mean two things, a secondary date, or an
  15941.         // invalid EndNote-style date. let''s see which one this is.
  15942.         // patent: application (filing) date -- do not append to date field 
  15943.         // for now. Zotero needs a filing date field added to make use of this.
  15944.         var dateParts = value.split("/");
  15945.         if(dateParts.length != 4 && item.itemType != "patent") {
  15946.             // an invalid date and not a patent. 
  15947.             // It''s from EndNote or Delphion (YYYY-MM-DD)
  15948.             if(item.date && value.indexOf(item.date) == -1) {
  15949.                 // append existing year
  15950.                 value += " " + item.date;
  15951.             }
  15952.             item.date = value;
  15953.         } 
  15954.         // ToDo: Handle correctly formatted Y2 fields (secondary date)
  15955.     } else if(tag == "N1" || tag == "AB") {
  15956.         // notes
  15957.         if(value != item.title) {       // why does EndNote do this!?
  15958.             item.notes.push({note:value});
  15959.         }
  15960.     } else if(tag == "N2") {
  15961.         // abstract
  15962.         item.abstractNote = value;
  15963.     } else if(tag == "KW") {
  15964.         // keywords/tags
  15965.         item.tags.push(value);
  15966.     } else if(tag == "SP") {
  15967.         // start page
  15968.         if(!item.pages) {
  15969.             item.pages = value;
  15970.         } else if(item.pages[0] == "-") {       // already have ending page
  15971.             item.pages = value + item.pages;
  15972.         } else {    // multiple ranges? hey, it''s a possibility
  15973.             item.pages += ", "+value;
  15974.         }
  15975.     } else if(tag == "EP") {
  15976.         // end page
  15977.         if(value) {
  15978.             if(!item.pages) {
  15979.                 item.pages = value;
  15980.             } else if(value != item.pages) {
  15981.                 item.pages += "-"+value;
  15982.             }
  15983.         }
  15984.     } else if(tag == "SN") {
  15985.         // ISSN/ISBN - just add both
  15986.         if(!item.ISBN) {
  15987.             item.ISBN = value;
  15988.         }
  15989.         if(!item.ISSN) {
  15990.             item.ISSN = value;
  15991.         }
  15992.     } else if(tag == "UR" || tag == "L1" || tag == "L2" || tag == "L4") {
  15993.         // URL
  15994.         if(!item.url) {
  15995.             item.url = value;
  15996.         }
  15997.         if(tag == "UR") {
  15998.             item.attachments.push({url:value});
  15999.         } else if(tag == "L1") {
  16000.             item.attachments.push({url:value, mimeType:"application/pdf",
  16001.                 title:"Full Text (PDF)", downloadable:true});
  16002.         } else if(tag == "L2") {
  16003.             item.attachments.push({url:value, mimeType:"text/html",
  16004.                 title:"Full Text (HTML)", downloadable:true});
  16005.         } else if(tag == "L4") {
  16006.             item.attachments.push({url:value,
  16007.                 title:"Image", downloadable:true});
  16008.         }
  16009.     } else if (tag == "IS") {
  16010.         // Issue Number (patent: patentNumber)
  16011.         if (item.itemType == "patent") {
  16012.             item.patentNumber = value;
  16013.         } else {
  16014.             item.issue = value;
  16015.         }
  16016.     } else if (tag == "VL") {
  16017.         // Volume Number (patent: applicationNumber)
  16018.         if (item.itemType == "patent") {
  16019.             item.applicationNumber = value;
  16020.         } else {
  16021.             item.volume = value;
  16022.         }
  16023.     } else if (tag == "PB") {
  16024.         // publisher (patent: references)
  16025.         if (item.itemType == "patent") {
  16026.             item.references = value;
  16027.         } else {
  16028.             item.publisher = value;
  16029.         }
  16030.     } else if (tag == "M1" || tag == "M2") {
  16031.         // Miscellaneous fields
  16032.         if (!item.extra) {
  16033.             item.extra = value;
  16034.         } else {
  16035.             item.extra += "; "+value;
  16036.         }
  16037.     }
  16038. }
  16039.  
  16040. function completeItem(item) {
  16041.     // if backup publication title exists but not proper, use backup
  16042.     // (hack to get newspaper titles from EndNote)
  16043.     if(item.backupPublicationTitle) {
  16044.         if(!item.publicationTitle) {
  16045.             item.publicationTitle = item.backupPublicationTitle;
  16046.         }
  16047.         item.backupPublicationTitle = undefined;
  16048.     }
  16049.     // hack for sites like Nature, which only use JA, journal abbreviation
  16050.     if(item.journalAbbreviation && !item.publicationTitle){
  16051.         item.publicationTitle = item.journalAbbreviation;
  16052.     }
  16053.     item.complete();
  16054. }
  16055.  
  16056. function doImport(attachments) {
  16057.     // this is apparently the proper character set for RIS, although i''m not
  16058.     // sure how many people follow this
  16059.     Zotero.setCharacterSet("IBM850");
  16060.  
  16061.     var line = true;
  16062.     var tag = data = false;
  16063.     do {    // first valid line is type
  16064.         Zotero.debug("ignoring "+line);
  16065.         line = Zotero.read();
  16066.         line = line.replace(/^\s+/, "");
  16067.     } while(line !== false && line.substr(0, 6) != "TY  - ");
  16068.  
  16069.     var item = new Zotero.Item();
  16070.     var i = 0;
  16071.     if(attachments && attachments[i]) {
  16072.         item.attachments = attachments[i];
  16073.     }
  16074.  
  16075.     var tag = "TY";
  16076.     var data = line.substr(6);
  16077.     var rawLine;
  16078.     while((rawLine = Zotero.read()) !== false) {    // until EOF
  16079.         // trim leading space if this line is not part of a note
  16080.         line = rawLine.replace(/^\s+/, "");
  16081.         Zotero.debug("line is "+rawLine);
  16082.         if(line.substr(2, 4) == "  - " || line == "ER  -") {
  16083.             // if this line is a tag, take a look at the previous line to map
  16084.             // its tag
  16085.             if(tag) {
  16086.                 processTag(item, tag, data);
  16087.             }
  16088.  
  16089.             // then fetch the tag and data from this line
  16090.             tag = line.substr(0,2);
  16091.             data = line.substr(6);
  16092.  
  16093.             Zotero.debug("tag: ''"+tag+"''; data: ''"+data+"''");
  16094.  
  16095.             if(tag == "ER") {           // ER signals end of reference
  16096.                 // unset info
  16097.                 tag = data = false;
  16098.                 // new item
  16099.                 completeItem(item);
  16100.                 item = new Zotero.Item();
  16101.                 i++;
  16102.                 if(attachments && attachments[i]) {
  16103.                     item.attachments = attachments[i];
  16104.                 }
  16105.             }
  16106.         } else {
  16107.             // otherwise, assume this is data from the previous line continued
  16108.             if(tag == "N1" || tag == "N2" || tag == "AB") {
  16109.                 // preserve line endings for N1/N2/AB fields, for EndNote
  16110.                 // compatibility
  16111.                 data += "\n"+rawLine;
  16112.             } else if(tag) {
  16113.                 // otherwise, follow the RIS spec
  16114.                 if(data[data.length-1] == " ") {
  16115.                     data += rawLine;
  16116.                 } else {
  16117.                     data += " "+rawLine;
  16118.                 }
  16119.             }
  16120.         }
  16121.     }
  16122.  
  16123.     if(tag && tag != "ER") {    // save any unprocessed tags
  16124.         Zotero.debug(tag);
  16125.         processTag(item, tag, data);
  16126.         completeItem(item);
  16127.     }
  16128. }
  16129.  
  16130. function addTag(tag, value) {
  16131.     if(value) {
  16132.         Zotero.write(tag+"  - "+value+"\r\n");
  16133.     }
  16134. }
  16135.  
  16136. function doExport() {
  16137.     // this is apparently the proper character set for RIS, although i''m not
  16138.     // sure how many people follow this
  16139.     Zotero.setCharacterSet("IBM850");
  16140.  
  16141.     var item;
  16142.  
  16143.     while(item = Zotero.nextItem()) {
  16144.         // can''t store independent notes in RIS
  16145.         if(item.itemType == "note" || item.itemType == "attachment") {
  16146.             continue;
  16147.         }
  16148.  
  16149.         // type
  16150.         addTag("TY", typeMap[item.itemType] ? typeMap[item.itemType] : "GEN");
  16151.  
  16152.         // use field map
  16153.         for(var j in fieldMap) {
  16154.             if(item[fieldMap[j]]) addTag(j, item[fieldMap[j]]);
  16155.         }
  16156.  
  16157.         // creators
  16158.         for(var j in item.creators) {
  16159.             // only two types, primary and secondary
  16160.             var risTag;
  16161.             // authors and inventors are primary creators
  16162.             if (item.creators[j].creatorType == "author" || item.creators[j].creatorType == "inventor") {
  16163.                 risTag = "A1";
  16164.             } else {
  16165.                 risTag = "A2";
  16166.             }
  16167.  
  16168.             addTag(risTag, item.creators[j].lastName+","+item.creators[j].firstName);
  16169.         }
  16170.         
  16171.         // assignee (patent)
  16172.         if(item.assignee) {
  16173.             addTag("A2", item.assignee);
  16174.         }
  16175.         
  16176.         // volume (patent: applicationNumber)
  16177.         if(item.volume || item.applicationNumber) {
  16178.             var value = (item.volume) ? item.volume : item.applicationNumber;
  16179.             addTag("VL", value);
  16180.         }
  16181.         
  16182.         // issue (patent: patentNumber)
  16183.         if(item.issue || item.patentNumber) {
  16184.             var value = (item.issue) ? item.issue : item.patentNumber;
  16185.             addTag("IS", value);
  16186.         }
  16187.  
  16188.         // publisher (patent: references)
  16189.         if(item.publisher || item.references) {
  16190.             var value = (item.publisher) ? item.publisher : item.references;
  16191.             addTag("PB", value);
  16192.         }
  16193.  
  16194.  
  16195.         // date
  16196.         if(item.date) {
  16197.             var date = Zotero.Utilities.strToDate(item.date);
  16198.             var string = date.year+"/";
  16199.             if(date.month != undefined) {
  16200.                 // deal with javascript months
  16201.                 date.month++;
  16202.                 if(date.month < 10) string += "0";
  16203.                 string += date.month;
  16204.             }
  16205.             string += "/";
  16206.             if(date.day != undefined) {
  16207.                 if(date.day < 10) string += "0";
  16208.                 string += date.day;
  16209.             }
  16210.             string += "/";
  16211.             if(date.part != undefined) {
  16212.                 string += date.part;
  16213.             }
  16214.             addTag("PY", string);
  16215.         }
  16216.  
  16217.         // notes
  16218.         if(Zotero.getOption("exportNotes")) {
  16219.             for(var j in item.notes) {
  16220.                 addTag("N1", item.notes[j].note.replace(/(?:\r\n?|\n)/g, "\r\n"));
  16221.             }
  16222.         }
  16223.  
  16224.         if(item.abstractNote) {
  16225.             addTag("N2", item.abstractNote.replace(/(?:\r\n?|\n)/g, "\r\n"));
  16226.         }
  16227.         else if(item.abstract) {
  16228.             // patent type has abstract
  16229.             addTag("N2", item.abstract.replace(/(?:\r\n?|\n)/g, "\r\n"));
  16230.         }
  16231.  
  16232.         // tags
  16233.         for each(var tag in item.tags) {
  16234.             addTag("KW", tag.tag);
  16235.         }
  16236.  
  16237.         // pages
  16238.         if(item.pages) {
  16239.             if(item.itemType == "book") {
  16240.                 addTag("EP", item.pages);
  16241.             } else {
  16242.                 var range = Zotero.Utilities.getPageRange(item.pages);
  16243.                 addTag("SP", range[0]);
  16244.                 addTag("EP", range[1]);
  16245.             }
  16246.         }
  16247.  
  16248.         // ISBN/ISSN
  16249.         addTag("SN", item.ISBN);
  16250.         addTag("SN", item.ISSN);
  16251.  
  16252.         // URL
  16253.         if(item.url) {
  16254.             addTag("UR", item.url);
  16255.         } else if(item.source && item.source.substr(0, 7) == "http://") {
  16256.             addTag("UR", item.source);
  16257.         }
  16258.  
  16259.         Zotero.write("ER  - \r\n\r\n");
  16260.     }
  16261. }');
  16262.  
  16263. REPLACE INTO translators VALUES ('881f60f2-0802-411a-9228-ce5f47b64c7d', '1.0.0b4.r5', '', '2008-01-22 19:00:00', '1', '100', '3', 'Refer/BibIX', 'Simon Kornblith', 'txt', 
  16264. 'Zotero.configure("dataMode", "line");
  16265.  
  16266. function detectImport() {
  16267.     var lineRe = /%[A-Z0-9\*\$] .+/;
  16268.     var line;
  16269.     var matched = 0;
  16270.     while((line = Zotero.read()) !== "false") {
  16271.         line = line.replace(/^\s+/, "");
  16272.         if(line != "") {
  16273.             if(lineRe.test(line)) {
  16274.                 matched++;
  16275.                 if(matched == 2) {
  16276.                     // threshold is two lines
  16277.                     return true;
  16278.                 }
  16279.             } else {
  16280.                 return false;
  16281.             }
  16282.         }
  16283.     }
  16284. }', 
  16285. 'var fieldMap = {
  16286.     T:"title",
  16287.     S:"series",
  16288.     V:"volume",
  16289.     N:"issue",
  16290.     C:"place",
  16291.     I:"publisher",
  16292.     R:"type",
  16293.     P:"pages",
  16294.     W:"archiveLocation",
  16295.     "*":"rights",
  16296.     "@":"ISBN",
  16297.     L:"callNumber",
  16298.     M:"accessionNumber",
  16299.     U:"url",
  16300.     7:"edition",
  16301.     X:"abstractNote"
  16302. };
  16303.  
  16304. var inputFieldMap = {
  16305.     J:"publicationTitle",
  16306.     B:"publicationTitle",
  16307.     9:"type"
  16308. };
  16309.  
  16310. // TODO: figure out if these are the best types for personal communication
  16311. var typeMap = {
  16312.     book:"Book",
  16313.     bookSection:"Book Section",
  16314.     journalArticle:"Journal Article",
  16315.     magazineArticle:"Magazine Article",
  16316.     newspaperArticle:"Newspaper Article",
  16317.     thesis:"Thesis",
  16318.     letter:"Personal Communication",
  16319.     manuscript:"Unpublished Work",
  16320.     interview:"Personal Communication",
  16321.     film:"Film or Broadcast",
  16322.     artwork:"Artwork",
  16323.     webpage:"Web Page",
  16324.     report:"Report",
  16325.     bill:"Bill",
  16326.     "case":"Case",
  16327.     hearing:"Hearing",
  16328.     patent:"Patent",
  16329.     statute:"Statute",
  16330.     email:"Personal Communication",
  16331.     map:"Map",
  16332.     blogPost:"Web Page",
  16333.     instantMessage:"Personal Communication",
  16334.     forumPost:"Web Page",
  16335.     audioRecording:"Audiovisual Material",
  16336.     presentation:"Report",
  16337.     videoRecording:"Audiovisual Material",
  16338.     tvBroadcast:"Film or Broadcast",
  16339.     radioBroadcast:"Film or Broadcast",
  16340.     podcast:"Audiovisual Material",
  16341.     computerProgram:"Computer Program",
  16342.     conferencePaper:"Conference Paper",
  16343.     document:"Generic",
  16344.     encyclopediaArticle:"Encyclopedia",
  16345.     dictionaryEntry:"Dictionary"
  16346. };
  16347.  
  16348. // supplements outputTypeMap for importing
  16349. // TODO: BILL, CASE, COMP, CONF, DATA, HEAR, MUSIC, PAT, SOUND, STAT
  16350. var inputTypeMap = {
  16351.     "Ancient Text":"book",
  16352.     "Audiovisual Material":"videoRecording",
  16353.     "Generic":"book",
  16354.     "Chart or Table":"artwork",
  16355.     "Classical Work":"book",
  16356.     "Conference Proceedings":"conferencePaper",
  16357.     "Conference Paper":"conferencePaper",
  16358.     "Edited Book":"book",
  16359.     "Electronic Article":"journalArticle",
  16360.     "Electronic Book":"book",
  16361.     "Equation":"artwork",
  16362.     "Figure":"artwork",
  16363.     "Government Document":"document",
  16364.     "Grant":"document",
  16365.     "Legal Rule or Regulation":"statute",
  16366.     "Online Database":"webpage",
  16367.     "Online Multimedia":"webpage",
  16368.     "Electronic Source":"webpage"
  16369. };
  16370.  
  16371. var isEndNote = false;
  16372.  
  16373. function processTag(item, tag, value) {
  16374.     value = Zotero.Utilities.superCleanString(value);
  16375.     if(fieldMap[tag]) {
  16376.         item[fieldMap[tag]] = value;
  16377.     } else if(inputFieldMap[tag]) {
  16378.         item[inputFieldMap[tag]] = value;
  16379.     } else if(tag == "0") {
  16380.         if(inputTypeMap[value]) {    // first check inputTypeMap
  16381.             item.itemType = inputTypeMap[value]
  16382.         } else {                    // then check typeMap
  16383.             for(var i in typeMap) {
  16384.                 if(value == typeMap[i]) {
  16385.                     item.itemType = i;
  16386.                     break;
  16387.                 }
  16388.             }
  16389.             // fall back to generic
  16390.             if(!item.itemType) item.itemType = inputTypeMap["Generic"];
  16391.         }
  16392.     } else if(tag == "A" || tag == "E" || tag == "?") {
  16393.         if(tag == "A") {
  16394.             var type = "author";
  16395.         } else if(tag == "E") {
  16396.             var type = "editor";
  16397.         } else if(tag == "?") {
  16398.             var type = "translator";
  16399.         }
  16400.         
  16401.         item.creators.push(Zotero.Utilities.cleanAuthor(value, type, value.indexOf(",") != -1));
  16402.     } else if(tag == "Q") {
  16403.         item.creators.push({creatorType:"author", lastName:value, fieldMode:true});
  16404.     } else if(tag == "H" || tag == "O") {
  16405.         item.extra += "\n"+value;
  16406.     } else if(tag == "Z") {
  16407.         item.notes.push({note:value});
  16408.     } else if(tag == "D") {
  16409.         if(item.date) {
  16410.             if(item.date.indexOf(value) == -1) {
  16411.                 item.date += " "+value;
  16412.             }
  16413.         } else {
  16414.             item.date = value;
  16415.         }
  16416.     } else if(tag == "8") {
  16417.         if(item.date) {
  16418.             if(value.indexOf(item.date) == -1) {
  16419.                 item.date += " "+value;
  16420.             }
  16421.         } else {
  16422.             item.date = value;
  16423.         }
  16424.     } else if(tag == "K") {
  16425.         item.tags = value.split("\n");
  16426.     }
  16427. }
  16428.  
  16429. function doImport() {
  16430.     // no character set is defined for this format. we use UTF-8.
  16431.     Zotero.setCharacterSet("UTF-8");
  16432.     
  16433.     var line = true;
  16434.     var tag = data = false;
  16435.     do {    // first valid line is type
  16436.         Zotero.debug("ignoring "+line);
  16437.         line = Zotero.read();
  16438.         line = line.replace(/^\s+/, "");
  16439.     } while(line !== false && line[0] != "%");
  16440.     
  16441.     var item = new Zotero.Item();
  16442.     
  16443.     var tag = line[1];
  16444.     var data = line.substr(3);
  16445.     while((line = Zotero.read()) !== false) {    // until EOF
  16446.         line = line.replace(/^\s+/, "");
  16447.         if(!line) {
  16448.             if(tag) {
  16449.                 processTag(item, tag, data);
  16450.                 // unset info
  16451.                 tag = data = readRecordEntry = false;
  16452.                 // new item
  16453.                 item.complete();
  16454.                 item = new Zotero.Item();
  16455.             }
  16456.         } else if(line[0] == "%" && line[2] == " ") {
  16457.             // if this line is a tag, take a look at the previous line to map
  16458.             // its tag
  16459.             if(tag) {
  16460.                 processTag(item, tag, data);
  16461.             }
  16462.             
  16463.             // then fetch the tag and data from this line
  16464.             tag = line[1];
  16465.             data = line.substr(3);
  16466.         } else {
  16467.             // otherwise, assume this is data from the previous line continued
  16468.             if(tag) {
  16469.                 data += "\n"+line;
  16470.             }
  16471.         }
  16472.     }
  16473.     
  16474.     if(tag) {    // save any unprocessed tags
  16475.         processTag(item, tag, data);
  16476.         item.complete();
  16477.     }
  16478. }
  16479.  
  16480. function addTag(tag, value) {
  16481.     if(value) {
  16482.         Zotero.write("%"+tag+" "+value+"\r\n");
  16483.     }
  16484. }
  16485.  
  16486. function doExport() {
  16487.     // use UTF-8 to export
  16488.     Zotero.setCharacterSet("UTF-8");
  16489.     
  16490.     var item;
  16491.     while(item = Zotero.nextItem()) {
  16492.         // can''t store independent notes in RIS
  16493.         if(item.itemType == "note" || item.itemType == "attachment") {
  16494.             continue;
  16495.         }
  16496.         
  16497.         // type
  16498.         addTag("0", typeMap[item.itemType] ? typeMap[item.itemType] : "Generic");
  16499.         
  16500.         // use field map
  16501.         for(var j in fieldMap) {
  16502.             if(item[fieldMap[j]]) addTag(j, item[fieldMap[j]]);
  16503.         }
  16504.         
  16505.         //handle J & B tags correctly
  16506.         if (item["publicationTitle"]) {
  16507.             if (item.itemType == "journalArticle") {
  16508.                 addTag("J", item["publicationTitle"]);
  16509.             } else {
  16510.                 addTag("B", item["publicationTitle"]);
  16511.             }
  16512.         }
  16513.         
  16514.         // creators
  16515.         for(var j in item.creators) {
  16516.             var referTag = "A";
  16517.             if(item.creators[j].creatorType == "editor") {
  16518.                 referTag = "E";
  16519.             } else if(item.creators[j].creatorType == "translator") {
  16520.                 referTag = "?";
  16521.             }
  16522.             
  16523.             addTag(referTag, item.creators[j].lastName+(item.creators[j].firstName ? ", "+item.creators[j].firstName : ""));
  16524.         }
  16525.         
  16526.         // date
  16527.         addTag("D", item.date);
  16528.         
  16529.         // tags
  16530.         if(item.tags) {
  16531.             var keywordTag = "";
  16532.             for each(var tag in item.tags) {
  16533.                 keywordTag += "\r\n"+tag.tag;
  16534.             }
  16535.             addTag("K", keywordTag.substr(2));
  16536.         }
  16537.         Zotero.write("\r\n");
  16538.     }
  16539. }');
  16540.  
  16541. REPLACE INTO translators VALUES ('9cb70025-a888-4a29-a210-93ec52da40d4', '1.0.0b4.r1', '', '2008-01-24 18:00:00', '1', '100', '3', 'BibTeX', 'Simon Kornblith', 'bib', 
  16542. 'Zotero.configure("dataMode", "block");
  16543. Zotero.addOption("UTF8", true);
  16544.  
  16545. function detectImport() {
  16546.     var block = "";
  16547.     var read;
  16548.     // read 20 chars out of the file
  16549.     while(read = Zotero.read(1)) {
  16550.         if(read == "%") {
  16551.             // read until next newline
  16552.             block = "";
  16553.             while(Zotero.read(1) != "\n") {}
  16554.         } else if(read == "\n" && block) {
  16555.             break;
  16556.         } else if(" \n\r\t".indexOf(read) == -1) {
  16557.             block += read;
  16558.         }
  16559.     }
  16560.     
  16561.     var re = /^@[a-zA-Z]+[\(\{]/;
  16562.     if(re.test(block)) {
  16563.         return true;
  16564.     }
  16565. }', 
  16566. 'var fieldMap = {
  16567.     address:"place",
  16568.     chapter:"section",
  16569.     edition:"edition",
  16570. //    number:"issue",
  16571.     type:"type",
  16572.     series:"series",
  16573.     title:"title",
  16574.     volume:"volume",
  16575.     copyright:"rights",
  16576.     isbn:"ISBN",
  16577.     issn:"ISSN",
  16578.     location:"archiveLocation",
  16579.     url:"url",
  16580.     doi:"DOI",
  16581.     "abstract":"abstractNote"
  16582. };
  16583.  
  16584. var inputFieldMap = {
  16585.     booktitle :"publicationTitle",
  16586.     school:"publisher",
  16587.     publisher:"publisher"
  16588. };
  16589.  
  16590. var typeMap = {
  16591.     book:"book",
  16592.     bookSection:"inbook",
  16593.     journalArticle:"article",
  16594.     magazineArticle:"article",
  16595.     newspaperArticle:"article",
  16596.     thesis:"phdthesis",
  16597.     letter:"misc",
  16598.     manuscript:"unpublished",
  16599.     interview:"misc",
  16600.     film:"misc",
  16601.     artwork:"misc",
  16602.     webpage:"misc",
  16603.     conferencePaper:"inproceedings"
  16604. };
  16605.  
  16606. // supplements outputTypeMap for importing
  16607. var inputTypeMap = {
  16608.     conference:"inproceedings",
  16609.     techreport:"report",
  16610.     booklet:"book",
  16611.     incollection:"bookSection",
  16612.     manual:"book",
  16613.     mastersthesis:"thesis",
  16614.     misc:"book",
  16615.     proceedings:"book"
  16616. };
  16617.  
  16618. /*
  16619.  * three-letter month abbreviations. i assume these are the same ones that the
  16620.  * docs say are defined in some appendix of the LaTeX book. (i don''t have the
  16621.  * LaTeX book.)
  16622.  */
  16623. var months = ["jan", "feb", "mar", "apr", "may", "jun",
  16624.               "jul", "aug", "sep", "oct", "nov", "dec"]
  16625.  
  16626. /*
  16627.  * new mapping table based on that from Matthias Steffens,
  16628.  * then enhanced with some fields generated from the unicode table.
  16629.  */
  16630.  
  16631. var mappingTable = {
  16632.     "\u00A0":"~", // NO-BREAK SPACE
  16633.     "\u00A1":"{\\textexclamdown}", // INVERTED EXCLAMATION MARK
  16634.     "\u00A2":"{\\textcent}", // CENT SIGN
  16635.     "\u00A3":"{\\textsterling}", // POUND SIGN
  16636.     "\u00A5":"{\\textyen}", // YEN SIGN
  16637.     "\u00A6":"{\\textbrokenbar}", // BROKEN BAR
  16638.     "\u00A7":"{\\textsection}", // SECTION SIGN
  16639.     "\u00A8":"{\\textasciidieresis}", // DIAERESIS
  16640.     "\u00A9":"{\\textcopyright}", // COPYRIGHT SIGN
  16641.     "\u00AA":"{\\textordfeminine}", // FEMININE ORDINAL INDICATOR
  16642.     "\u00AB":"{\\guillemotleft}", // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
  16643.     "\u00AC":"{\\textlnot}", // NOT SIGN
  16644.     "\u00AD":"-", // SOFT HYPHEN
  16645.     "\u00AE":"{\\textregistered}", // REGISTERED SIGN
  16646.     "\u00AF":"{\\textasciimacron}", // MACRON
  16647.     "\u00B0":"{\\textdegree}", // DEGREE SIGN
  16648.     "\u00B1":"{\\textpm}", // PLUS-MINUS SIGN
  16649.     "\u00B2":"{\\texttwosuperior}", // SUPERSCRIPT TWO
  16650.     "\u00B3":"{\\textthreesuperior}", // SUPERSCRIPT THREE
  16651.     "\u00B4":"{\\textasciiacute}", // ACUTE ACCENT
  16652.     "\u00B5":"{\\textmu}", // MICRO SIGN
  16653.     "\u00B6":"{\\textparagraph}", // PILCROW SIGN
  16654.     "\u00B7":"{\\textperiodcentered}", // MIDDLE DOT
  16655.     "\u00B8":"{\\c\\ }", // CEDILLA
  16656.     "\u00B9":"{\\textonesuperior}", // SUPERSCRIPT ONE
  16657.     "\u00BA":"{\\textordmasculine}", // MASCULINE ORDINAL INDICATOR
  16658.     "\u00BB":"{\\guillemotright}", // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
  16659.     "\u00BC":"{\\textonequarter}", // VULGAR FRACTION ONE QUARTER
  16660.     "\u00BD":"{\\textonehalf}", // VULGAR FRACTION ONE HALF
  16661.     "\u00BE":"{\\textthreequarters}", // VULGAR FRACTION THREE QUARTERS
  16662.     "\u00BF":"{\\textquestiondown}", // INVERTED QUESTION MARK
  16663.     "\u00C6":"{\\AE}", // LATIN CAPITAL LETTER AE
  16664.     "\u00D0":"{\\DH}", // LATIN CAPITAL LETTER ETH
  16665.     "\u00D7":"{\\texttimes}", // MULTIPLICATION SIGN
  16666.     "\u00DE":"{\\TH}", // LATIN CAPITAL LETTER THORN
  16667.     "\u00DF":"{\\ss}", // LATIN SMALL LETTER SHARP S
  16668.     "\u00E6":"{\\ae}", // LATIN SMALL LETTER AE
  16669.     "\u00F0":"{\\dh}", // LATIN SMALL LETTER ETH
  16670.     "\u00F7":"{\\textdiv}", // DIVISION SIGN
  16671.     "\u00FE":"{\\th}", // LATIN SMALL LETTER THORN
  16672.     "\u0131":"{\\i}", // LATIN SMALL LETTER DOTLESS I
  16673.     "\u0132":"IJ", // LATIN CAPITAL LIGATURE IJ
  16674.     "\u0133":"ij", // LATIN SMALL LIGATURE IJ
  16675.     "\u0138":"k", // LATIN SMALL LETTER KRA
  16676.     "\u0149":"''n", // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
  16677.     "\u014A":"{\\NG}", // LATIN CAPITAL LETTER ENG
  16678.     "\u014B":"{\\ng}", // LATIN SMALL LETTER ENG
  16679.     "\u0152":"{\\OE}", // LATIN CAPITAL LIGATURE OE
  16680.     "\u0153":"{\\oe}", // LATIN SMALL LIGATURE OE
  16681.     "\u017F":"s", // LATIN SMALL LETTER LONG S
  16682.     "\u02B9":"''", // MODIFIER LETTER PRIME
  16683.     "\u02BB":"''", // MODIFIER LETTER TURNED COMMA
  16684.     "\u02BC":"''", // MODIFIER LETTER APOSTROPHE
  16685.     "\u02BD":"''", // MODIFIER LETTER REVERSED COMMA
  16686.     "\u02C6":"{\\textasciicircum}", // MODIFIER LETTER CIRCUMFLEX ACCENT
  16687.     "\u02C8":"''", // MODIFIER LETTER VERTICAL LINE
  16688.     "\u02C9":"-", // MODIFIER LETTER MACRON
  16689.     "\u02CC":",", // MODIFIER LETTER LOW VERTICAL LINE
  16690.     "\u02D0":":", // MODIFIER LETTER TRIANGULAR COLON
  16691.     "\u02DA":"o", // RING ABOVE
  16692.     "\u02DC":"\\~{}", // SMALL TILDE
  16693.     "\u02DD":"{\\textacutedbl}", // DOUBLE ACUTE ACCENT
  16694.     "\u0374":"''", // GREEK NUMERAL SIGN
  16695.     "\u0375":",", // GREEK LOWER NUMERAL SIGN
  16696.     "\u037E":";", // GREEK QUESTION MARK
  16697.     "\u2000":" ", // EN QUAD
  16698.     "\u2001":"  ", // EM QUAD
  16699.     "\u2002":" ", // EN SPACE
  16700.     "\u2003":"  ", // EM SPACE
  16701.     "\u2004":" ", // THREE-PER-EM SPACE
  16702.     "\u2005":" ", // FOUR-PER-EM SPACE
  16703.     "\u2006":" ", // SIX-PER-EM SPACE
  16704.     "\u2007":" ", // FIGURE SPACE
  16705.     "\u2008":" ", // PUNCTUATION SPACE
  16706.     "\u2009":" ", // THIN SPACE
  16707.     "\u2010":"-", // HYPHEN
  16708.     "\u2011":"-", // NON-BREAKING HYPHEN
  16709.     "\u2012":"-", // FIGURE DASH
  16710.     "\u2013":"{\\textendash}", // EN DASH
  16711.     "\u2014":"{\\textemdash}", // EM DASH
  16712.     "\u2015":"--", // HORIZONTAL BAR
  16713.     "\u2016":"{\\textbardbl}", // DOUBLE VERTICAL LINE
  16714.     "\u2017":"{\\textunderscore}", // DOUBLE LOW LINE
  16715.     "\u2018":"{\\textquoteleft}", // LEFT SINGLE QUOTATION MARK
  16716.     "\u2019":"{\\textquoteright}", // RIGHT SINGLE QUOTATION MARK
  16717.     "\u201A":"{\\quotesinglbase}", // SINGLE LOW-9 QUOTATION MARK
  16718.     "\u201B":"''", // SINGLE HIGH-REVERSED-9 QUOTATION MARK
  16719.     "\u201C":"{\\textquotedblleft}", // LEFT DOUBLE QUOTATION MARK
  16720.     "\u201D":"{\\textquotedblright}", // RIGHT DOUBLE QUOTATION MARK
  16721.     "\u201E":"{\\quotedblbase}", // DOUBLE LOW-9 QUOTATION MARK
  16722.     "\u201F":"{\\quotedblbase}", // DOUBLE HIGH-REVERSED-9 QUOTATION MARK
  16723.     "\u2020":"{\\textdagger}", // DAGGER
  16724.     "\u2021":"{\\textdaggerdbl}", // DOUBLE DAGGER
  16725.     "\u2022":"{\\textbullet}", // BULLET
  16726.     "\u2023":">", // TRIANGULAR BULLET
  16727.     "\u2024":".", // ONE DOT LEADER
  16728.     "\u2025":"..", // TWO DOT LEADER
  16729.     "\u2026":"{\\textellipsis}", // HORIZONTAL ELLIPSIS
  16730.     "\u2027":"-", // HYPHENATION POINT
  16731.     "\u202F":" ", // NARROW NO-BREAK SPACE
  16732.     "\u2030":"{\\textperthousand}", // PER MILLE SIGN
  16733.     "\u2032":"''", // PRIME
  16734.     "\u2033":"''", // DOUBLE PRIME
  16735.     "\u2034":"''''''", // TRIPLE PRIME
  16736.     "\u2035":"`", // REVERSED PRIME
  16737.     "\u2036":"``", // REVERSED DOUBLE PRIME
  16738.     "\u2037":"```", // REVERSED TRIPLE PRIME
  16739.     "\u2039":"{\\guilsinglleft}", // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
  16740.     "\u203A":"{\\guilsinglright}", // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
  16741.     "\u203C":"!!", // DOUBLE EXCLAMATION MARK
  16742.     "\u203E":"-", // OVERLINE
  16743.     "\u2043":"-", // HYPHEN BULLET
  16744.     "\u2044":"{\\textfractionsolidus}", // FRACTION SLASH
  16745.     "\u2048":"?!", // QUESTION EXCLAMATION MARK
  16746.     "\u2049":"!?", // EXCLAMATION QUESTION MARK
  16747.     "\u204A":"7", // TIRONIAN SIGN ET
  16748.     "\u2070":"$^{0}$", // SUPERSCRIPT ZERO
  16749.     "\u2074":"$^{4}$", // SUPERSCRIPT FOUR
  16750.     "\u2075":"$^{5}$", // SUPERSCRIPT FIVE
  16751.     "\u2076":"$^{6}$", // SUPERSCRIPT SIX
  16752.     "\u2077":"$^{7}$", // SUPERSCRIPT SEVEN
  16753.     "\u2078":"$^{8}$", // SUPERSCRIPT EIGHT
  16754.     "\u2079":"$^{9}$", // SUPERSCRIPT NINE
  16755.     "\u207A":"$^{+}$", // SUPERSCRIPT PLUS SIGN
  16756.     "\u207B":"$^{-}$", // SUPERSCRIPT MINUS
  16757.     "\u207C":"$^{=}$", // SUPERSCRIPT EQUALS SIGN
  16758.     "\u207D":"$^{(}$", // SUPERSCRIPT LEFT PARENTHESIS
  16759.     "\u207E":"$^{)}$", // SUPERSCRIPT RIGHT PARENTHESIS
  16760.     "\u207F":"$^{n}$", // SUPERSCRIPT LATIN SMALL LETTER N
  16761.     "\u2080":"$_{0}$", // SUBSCRIPT ZERO
  16762.     "\u2081":"$_{1}$", // SUBSCRIPT ONE
  16763.     "\u2082":"$_{2}$", // SUBSCRIPT TWO
  16764.     "\u2083":"$_{3}$", // SUBSCRIPT THREE
  16765.     "\u2084":"$_{4}$", // SUBSCRIPT FOUR
  16766.     "\u2085":"$_{5}$", // SUBSCRIPT FIVE
  16767.     "\u2086":"$_{6}$", // SUBSCRIPT SIX
  16768.     "\u2087":"$_{7}$", // SUBSCRIPT SEVEN
  16769.     "\u2088":"$_{8}$", // SUBSCRIPT EIGHT
  16770.     "\u2089":"$_{9}$", // SUBSCRIPT NINE
  16771.     "\u208A":"$_{+}$", // SUBSCRIPT PLUS SIGN
  16772.     "\u208B":"$_{-}$", // SUBSCRIPT MINUS
  16773.     "\u208C":"$_{=}$", // SUBSCRIPT EQUALS SIGN
  16774.     "\u208D":"$_{(}$", // SUBSCRIPT LEFT PARENTHESIS
  16775.     "\u208E":"$_{)}$", // SUBSCRIPT RIGHT PARENTHESIS
  16776.     "\u20AC":"{\\texteuro}", // EURO SIGN
  16777.     "\u2100":"a/c", // ACCOUNT OF
  16778.     "\u2101":"a/s", // ADDRESSED TO THE SUBJECT
  16779.     "\u2103":"{\\textcelsius}", // DEGREE CELSIUS
  16780.     "\u2105":"c/o", // CARE OF
  16781.     "\u2106":"c/u", // CADA UNA
  16782.     "\u2109":"F", // DEGREE FAHRENHEIT
  16783.     "\u2113":"l", // SCRIPT SMALL L
  16784.     "\u2116":"{\\textnumero}", // NUMERO SIGN
  16785.     "\u2117":"{\\textcircledP}", // SOUND RECORDING COPYRIGHT
  16786.     "\u2120":"{\\textservicemark}", // SERVICE MARK
  16787.     "\u2121":"TEL", // TELEPHONE SIGN
  16788.     "\u2122":"{\\texttrademark}", // TRADE MARK SIGN
  16789.     "\u2126":"{\\textohm}", // OHM SIGN
  16790.     "\u212A":"K", // KELVIN SIGN
  16791.     "\u212B":"A", // ANGSTROM SIGN
  16792.     "\u212E":"{\\textestimated}", // ESTIMATED SYMBOL
  16793.     "\u2153":" 1/3", // VULGAR FRACTION ONE THIRD
  16794.     "\u2154":" 2/3", // VULGAR FRACTION TWO THIRDS
  16795.     "\u2155":" 1/5", // VULGAR FRACTION ONE FIFTH
  16796.     "\u2156":" 2/5", // VULGAR FRACTION TWO FIFTHS
  16797.     "\u2157":" 3/5", // VULGAR FRACTION THREE FIFTHS
  16798.     "\u2158":" 4/5", // VULGAR FRACTION FOUR FIFTHS
  16799.     "\u2159":" 1/6", // VULGAR FRACTION ONE SIXTH
  16800.     "\u215A":" 5/6", // VULGAR FRACTION FIVE SIXTHS
  16801.     "\u215B":" 1/8", // VULGAR FRACTION ONE EIGHTH
  16802.     "\u215C":" 3/8", // VULGAR FRACTION THREE EIGHTHS
  16803.     "\u215D":" 5/8", // VULGAR FRACTION FIVE EIGHTHS
  16804.     "\u215E":" 7/8", // VULGAR FRACTION SEVEN EIGHTHS
  16805.     "\u215F":" 1/", // FRACTION NUMERATOR ONE
  16806.     "\u2160":"I", // ROMAN NUMERAL ONE
  16807.     "\u2161":"II", // ROMAN NUMERAL TWO
  16808.     "\u2162":"III", // ROMAN NUMERAL THREE
  16809.     "\u2163":"IV", // ROMAN NUMERAL FOUR
  16810.     "\u2164":"V", // ROMAN NUMERAL FIVE
  16811.     "\u2165":"VI", // ROMAN NUMERAL SIX
  16812.     "\u2166":"VII", // ROMAN NUMERAL SEVEN
  16813.     "\u2167":"VIII", // ROMAN NUMERAL EIGHT
  16814.     "\u2168":"IX", // ROMAN NUMERAL NINE
  16815.     "\u2169":"X", // ROMAN NUMERAL TEN
  16816.     "\u216A":"XI", // ROMAN NUMERAL ELEVEN
  16817.     "\u216B":"XII", // ROMAN NUMERAL TWELVE
  16818.     "\u216C":"L", // ROMAN NUMERAL FIFTY
  16819.     "\u216D":"C", // ROMAN NUMERAL ONE HUNDRED
  16820.     "\u216E":"D", // ROMAN NUMERAL FIVE HUNDRED
  16821.     "\u216F":"M", // ROMAN NUMERAL ONE THOUSAND
  16822.     "\u2170":"i", // SMALL ROMAN NUMERAL ONE
  16823.     "\u2171":"ii", // SMALL ROMAN NUMERAL TWO
  16824.     "\u2172":"iii", // SMALL ROMAN NUMERAL THREE
  16825.     "\u2173":"iv", // SMALL ROMAN NUMERAL FOUR
  16826.     "\u2174":"v", // SMALL ROMAN NUMERAL FIVE
  16827.     "\u2175":"vi", // SMALL ROMAN NUMERAL SIX
  16828.     "\u2176":"vii", // SMALL ROMAN NUMERAL SEVEN
  16829.     "\u2177":"viii", // SMALL ROMAN NUMERAL EIGHT
  16830.     "\u2178":"ix", // SMALL ROMAN NUMERAL NINE
  16831.     "\u2179":"x", // SMALL ROMAN NUMERAL TEN
  16832.     "\u217A":"xi", // SMALL ROMAN NUMERAL ELEVEN
  16833.     "\u217B":"xii", // SMALL ROMAN NUMERAL TWELVE
  16834.     "\u217C":"l", // SMALL ROMAN NUMERAL FIFTY
  16835.     "\u217D":"c", // SMALL ROMAN NUMERAL ONE HUNDRED
  16836.     "\u217E":"d", // SMALL ROMAN NUMERAL FIVE HUNDRED
  16837.     "\u217F":"m", // SMALL ROMAN NUMERAL ONE THOUSAND
  16838.     "\u2190":"{\\textleftarrow}", // LEFTWARDS ARROW
  16839.     "\u2191":"{\\textuparrow}", // UPWARDS ARROW
  16840.     "\u2192":"{\\textrightarrow}", // RIGHTWARDS ARROW
  16841.     "\u2193":"{\\textdownarrow}", // DOWNWARDS ARROW
  16842.     "\u2194":"<->", // LEFT RIGHT ARROW
  16843.     "\u21D0":"<=", // LEFTWARDS DOUBLE ARROW
  16844.     "\u21D2":"=>", // RIGHTWARDS DOUBLE ARROW
  16845.     "\u21D4":"<=>", // LEFT RIGHT DOUBLE ARROW
  16846.     "\u2212":"-", // MINUS SIGN
  16847.     "\u2215":"/", // DIVISION SLASH
  16848.     "\u2216":"\\", // SET MINUS
  16849.     "\u2217":"*", // ASTERISK OPERATOR
  16850.     "\u2218":"o", // RING OPERATOR
  16851.     "\u2219":".", // BULLET OPERATOR
  16852.     "\u221E":"$\\infty$", // INFINITY
  16853.     "\u2223":"|", // DIVIDES
  16854.     "\u2225":"||", // PARALLEL TO
  16855.     "\u2236":":", // RATIO
  16856.     "\u223C":"\\~{}", // TILDE OPERATOR
  16857.     "\u2260":"/=", // NOT EQUAL TO
  16858.     "\u2261":"=", // IDENTICAL TO
  16859.     "\u2264":"<=", // LESS-THAN OR EQUAL TO
  16860.     "\u2265":">=", // GREATER-THAN OR EQUAL TO
  16861.     "\u226A":"<<", // MUCH LESS-THAN
  16862.     "\u226B":">>", // MUCH GREATER-THAN
  16863.     "\u2295":"(+)", // CIRCLED PLUS
  16864.     "\u2296":"(-)", // CIRCLED MINUS
  16865.     "\u2297":"(x)", // CIRCLED TIMES
  16866.     "\u2298":"(/)", // CIRCLED DIVISION SLASH
  16867.     "\u22A2":"|-", // RIGHT TACK
  16868.     "\u22A3":"-|", // LEFT TACK
  16869.     "\u22A6":"|-", // ASSERTION
  16870.     "\u22A7":"|=", // MODELS
  16871.     "\u22A8":"|=", // TRUE
  16872.     "\u22A9":"||-", // FORCES
  16873.     "\u22C5":".", // DOT OPERATOR
  16874.     "\u22C6":"*", // STAR OPERATOR
  16875.     "\u22D5":"$\\#$", // EQUAL AND PARALLEL TO
  16876.     "\u22D8":"<<<", // VERY MUCH LESS-THAN
  16877.     "\u22D9":">>>", // VERY MUCH GREATER-THAN
  16878.     "\u22EF":"...", // MIDLINE HORIZONTAL ELLIPSIS
  16879.     "\u2329":"{\\textlangle}", // LEFT-POINTING ANGLE BRACKET
  16880.     "\u232A":"{\\textrangle}", // RIGHT-POINTING ANGLE BRACKET
  16881.     "\u2400":"NUL", // SYMBOL FOR NULL
  16882.     "\u2401":"SOH", // SYMBOL FOR START OF HEADING
  16883.     "\u2402":"STX", // SYMBOL FOR START OF TEXT
  16884.     "\u2403":"ETX", // SYMBOL FOR END OF TEXT
  16885.     "\u2404":"EOT", // SYMBOL FOR END OF TRANSMISSION
  16886.     "\u2405":"ENQ", // SYMBOL FOR ENQUIRY
  16887.     "\u2406":"ACK", // SYMBOL FOR ACKNOWLEDGE
  16888.     "\u2407":"BEL", // SYMBOL FOR BELL
  16889.     "\u2408":"BS", // SYMBOL FOR BACKSPACE
  16890.     "\u2409":"HT", // SYMBOL FOR HORIZONTAL TABULATION
  16891.     "\u240A":"LF", // SYMBOL FOR LINE FEED
  16892.     "\u240B":"VT", // SYMBOL FOR VERTICAL TABULATION
  16893.     "\u240C":"FF", // SYMBOL FOR FORM FEED
  16894.     "\u240D":"CR", // SYMBOL FOR CARRIAGE RETURN
  16895.     "\u240E":"SO", // SYMBOL FOR SHIFT OUT
  16896.     "\u240F":"SI", // SYMBOL FOR SHIFT IN
  16897.     "\u2410":"DLE", // SYMBOL FOR DATA LINK ESCAPE
  16898.     "\u2411":"DC1", // SYMBOL FOR DEVICE CONTROL ONE
  16899.     "\u2412":"DC2", // SYMBOL FOR DEVICE CONTROL TWO
  16900.     "\u2413":"DC3", // SYMBOL FOR DEVICE CONTROL THREE
  16901.     "\u2414":"DC4", // SYMBOL FOR DEVICE CONTROL FOUR
  16902.     "\u2415":"NAK", // SYMBOL FOR NEGATIVE ACKNOWLEDGE
  16903.     "\u2416":"SYN", // SYMBOL FOR SYNCHRONOUS IDLE
  16904.     "\u2417":"ETB", // SYMBOL FOR END OF TRANSMISSION BLOCK
  16905.     "\u2418":"CAN", // SYMBOL FOR CANCEL
  16906.     "\u2419":"EM", // SYMBOL FOR END OF MEDIUM
  16907.     "\u241A":"SUB", // SYMBOL FOR SUBSTITUTE
  16908.     "\u241B":"ESC", // SYMBOL FOR ESCAPE
  16909.     "\u241C":"FS", // SYMBOL FOR FILE SEPARATOR
  16910.     "\u241D":"GS", // SYMBOL FOR GROUP SEPARATOR
  16911.     "\u241E":"RS", // SYMBOL FOR RECORD SEPARATOR
  16912.     "\u241F":"US", // SYMBOL FOR UNIT SEPARATOR
  16913.     "\u2420":"SP", // SYMBOL FOR SPACE
  16914.     "\u2421":"DEL", // SYMBOL FOR DELETE
  16915.     "\u2423":"{\\textvisiblespace}", // OPEN BOX
  16916.     "\u2424":"NL", // SYMBOL FOR NEWLINE
  16917.     "\u2425":"///", // SYMBOL FOR DELETE FORM TWO
  16918.     "\u2426":"?", // SYMBOL FOR SUBSTITUTE FORM TWO
  16919.     "\u2460":"(1)", // CIRCLED DIGIT ONE
  16920.     "\u2461":"(2)", // CIRCLED DIGIT TWO
  16921.     "\u2462":"(3)", // CIRCLED DIGIT THREE
  16922.     "\u2463":"(4)", // CIRCLED DIGIT FOUR
  16923.     "\u2464":"(5)", // CIRCLED DIGIT FIVE
  16924.     "\u2465":"(6)", // CIRCLED DIGIT SIX
  16925.     "\u2466":"(7)", // CIRCLED DIGIT SEVEN
  16926.     "\u2467":"(8)", // CIRCLED DIGIT EIGHT
  16927.     "\u2468":"(9)", // CIRCLED DIGIT NINE
  16928.     "\u2469":"(10)", // CIRCLED NUMBER TEN
  16929.     "\u246A":"(11)", // CIRCLED NUMBER ELEVEN
  16930.     "\u246B":"(12)", // CIRCLED NUMBER TWELVE
  16931.     "\u246C":"(13)", // CIRCLED NUMBER THIRTEEN
  16932.     "\u246D":"(14)", // CIRCLED NUMBER FOURTEEN
  16933.     "\u246E":"(15)", // CIRCLED NUMBER FIFTEEN
  16934.     "\u246F":"(16)", // CIRCLED NUMBER SIXTEEN
  16935.     "\u2470":"(17)", // CIRCLED NUMBER SEVENTEEN
  16936.     "\u2471":"(18)", // CIRCLED NUMBER EIGHTEEN
  16937.     "\u2472":"(19)", // CIRCLED NUMBER NINETEEN
  16938.     "\u2473":"(20)", // CIRCLED NUMBER TWENTY
  16939.     "\u2474":"(1)", // PARENTHESIZED DIGIT ONE
  16940.     "\u2475":"(2)", // PARENTHESIZED DIGIT TWO
  16941.     "\u2476":"(3)", // PARENTHESIZED DIGIT THREE
  16942.     "\u2477":"(4)", // PARENTHESIZED DIGIT FOUR
  16943.     "\u2478":"(5)", // PARENTHESIZED DIGIT FIVE
  16944.     "\u2479":"(6)", // PARENTHESIZED DIGIT SIX
  16945.     "\u247A":"(7)", // PARENTHESIZED DIGIT SEVEN
  16946.     "\u247B":"(8)", // PARENTHESIZED DIGIT EIGHT
  16947.     "\u247C":"(9)", // PARENTHESIZED DIGIT NINE
  16948.     "\u247D":"(10)", // PARENTHESIZED NUMBER TEN
  16949.     "\u247E":"(11)", // PARENTHESIZED NUMBER ELEVEN
  16950.     "\u247F":"(12)", // PARENTHESIZED NUMBER TWELVE
  16951.     "\u2480":"(13)", // PARENTHESIZED NUMBER THIRTEEN
  16952.     "\u2481":"(14)", // PARENTHESIZED NUMBER FOURTEEN
  16953.     "\u2482":"(15)", // PARENTHESIZED NUMBER FIFTEEN
  16954.     "\u2483":"(16)", // PARENTHESIZED NUMBER SIXTEEN
  16955.     "\u2484":"(17)", // PARENTHESIZED NUMBER SEVENTEEN
  16956.     "\u2485":"(18)", // PARENTHESIZED NUMBER EIGHTEEN
  16957.     "\u2486":"(19)", // PARENTHESIZED NUMBER NINETEEN
  16958.     "\u2487":"(20)", // PARENTHESIZED NUMBER TWENTY
  16959.     "\u2488":"1.", // DIGIT ONE FULL STOP
  16960.     "\u2489":"2.", // DIGIT TWO FULL STOP
  16961.     "\u248A":"3.", // DIGIT THREE FULL STOP
  16962.     "\u248B":"4.", // DIGIT FOUR FULL STOP
  16963.     "\u248C":"5.", // DIGIT FIVE FULL STOP
  16964.     "\u248D":"6.", // DIGIT SIX FULL STOP
  16965.     "\u248E":"7.", // DIGIT SEVEN FULL STOP
  16966.     "\u248F":"8.", // DIGIT EIGHT FULL STOP
  16967.     "\u2490":"9.", // DIGIT NINE FULL STOP
  16968.     "\u2491":"10.", // NUMBER TEN FULL STOP
  16969.     "\u2492":"11.", // NUMBER ELEVEN FULL STOP
  16970.     "\u2493":"12.", // NUMBER TWELVE FULL STOP
  16971.     "\u2494":"13.", // NUMBER THIRTEEN FULL STOP
  16972.     "\u2495":"14.", // NUMBER FOURTEEN FULL STOP
  16973.     "\u2496":"15.", // NUMBER FIFTEEN FULL STOP
  16974.     "\u2497":"16.", // NUMBER SIXTEEN FULL STOP
  16975.     "\u2498":"17.", // NUMBER SEVENTEEN FULL STOP
  16976.     "\u2499":"18.", // NUMBER EIGHTEEN FULL STOP
  16977.     "\u249A":"19.", // NUMBER NINETEEN FULL STOP
  16978.     "\u249B":"20.", // NUMBER TWENTY FULL STOP
  16979.     "\u249C":"(a)", // PARENTHESIZED LATIN SMALL LETTER A
  16980.     "\u249D":"(b)", // PARENTHESIZED LATIN SMALL LETTER B
  16981.     "\u249E":"(c)", // PARENTHESIZED LATIN SMALL LETTER C
  16982.     "\u249F":"(d)", // PARENTHESIZED LATIN SMALL LETTER D
  16983.     "\u24A0":"(e)", // PARENTHESIZED LATIN SMALL LETTER E
  16984.     "\u24A1":"(f)", // PARENTHESIZED LATIN SMALL LETTER F
  16985.     "\u24A2":"(g)", // PARENTHESIZED LATIN SMALL LETTER G
  16986.     "\u24A3":"(h)", // PARENTHESIZED LATIN SMALL LETTER H
  16987.     "\u24A4":"(i)", // PARENTHESIZED LATIN SMALL LETTER I
  16988.     "\u24A5":"(j)", // PARENTHESIZED LATIN SMALL LETTER J
  16989.     "\u24A6":"(k)", // PARENTHESIZED LATIN SMALL LETTER K
  16990.     "\u24A7":"(l)", // PARENTHESIZED LATIN SMALL LETTER L
  16991.     "\u24A8":"(m)", // PARENTHESIZED LATIN SMALL LETTER M
  16992.     "\u24A9":"(n)", // PARENTHESIZED LATIN SMALL LETTER N
  16993.     "\u24AA":"(o)", // PARENTHESIZED LATIN SMALL LETTER O
  16994.     "\u24AB":"(p)", // PARENTHESIZED LATIN SMALL LETTER P
  16995.     "\u24AC":"(q)", // PARENTHESIZED LATIN SMALL LETTER Q
  16996.     "\u24AD":"(r)", // PARENTHESIZED LATIN SMALL LETTER R
  16997.     "\u24AE":"(s)", // PARENTHESIZED LATIN SMALL LETTER S
  16998.     "\u24AF":"(t)", // PARENTHESIZED LATIN SMALL LETTER T
  16999.     "\u24B0":"(u)", // PARENTHESIZED LATIN SMALL LETTER U
  17000.     "\u24B1":"(v)", // PARENTHESIZED LATIN SMALL LETTER V
  17001.     "\u24B2":"(w)", // PARENTHESIZED LATIN SMALL LETTER W
  17002.     "\u24B3":"(x)", // PARENTHESIZED LATIN SMALL LETTER X
  17003.     "\u24B4":"(y)", // PARENTHESIZED LATIN SMALL LETTER Y
  17004.     "\u24B5":"(z)", // PARENTHESIZED LATIN SMALL LETTER Z
  17005.     "\u24B6":"(A)", // CIRCLED LATIN CAPITAL LETTER A
  17006.     "\u24B7":"(B)", // CIRCLED LATIN CAPITAL LETTER B
  17007.     "\u24B8":"(C)", // CIRCLED LATIN CAPITAL LETTER C
  17008.     "\u24B9":"(D)", // CIRCLED LATIN CAPITAL LETTER D
  17009.     "\u24BA":"(E)", // CIRCLED LATIN CAPITAL LETTER E
  17010.     "\u24BB":"(F)", // CIRCLED LATIN CAPITAL LETTER F
  17011.     "\u24BC":"(G)", // CIRCLED LATIN CAPITAL LETTER G
  17012.     "\u24BD":"(H)", // CIRCLED LATIN CAPITAL LETTER H
  17013.     "\u24BE":"(I)", // CIRCLED LATIN CAPITAL LETTER I
  17014.     "\u24BF":"(J)", // CIRCLED LATIN CAPITAL LETTER J
  17015.     "\u24C0":"(K)", // CIRCLED LATIN CAPITAL LETTER K
  17016.     "\u24C1":"(L)", // CIRCLED LATIN CAPITAL LETTER L
  17017.     "\u24C2":"(M)", // CIRCLED LATIN CAPITAL LETTER M
  17018.     "\u24C3":"(N)", // CIRCLED LATIN CAPITAL LETTER N
  17019.     "\u24C4":"(O)", // CIRCLED LATIN CAPITAL LETTER O
  17020.     "\u24C5":"(P)", // CIRCLED LATIN CAPITAL LETTER P
  17021.     "\u24C6":"(Q)", // CIRCLED LATIN CAPITAL LETTER Q
  17022.     "\u24C7":"(R)", // CIRCLED LATIN CAPITAL LETTER R
  17023.     "\u24C8":"(S)", // CIRCLED LATIN CAPITAL LETTER S
  17024.     "\u24C9":"(T)", // CIRCLED LATIN CAPITAL LETTER T
  17025.     "\u24CA":"(U)", // CIRCLED LATIN CAPITAL LETTER U
  17026.     "\u24CB":"(V)", // CIRCLED LATIN CAPITAL LETTER V
  17027.     "\u24CC":"(W)", // CIRCLED LATIN CAPITAL LETTER W
  17028.     "\u24CD":"(X)", // CIRCLED LATIN CAPITAL LETTER X
  17029.     "\u24CE":"(Y)", // CIRCLED LATIN CAPITAL LETTER Y
  17030.     "\u24CF":"(Z)", // CIRCLED LATIN CAPITAL LETTER Z
  17031.     "\u24D0":"(a)", // CIRCLED LATIN SMALL LETTER A
  17032.     "\u24D1":"(b)", // CIRCLED LATIN SMALL LETTER B
  17033.     "\u24D2":"(c)", // CIRCLED LATIN SMALL LETTER C
  17034.     "\u24D3":"(d)", // CIRCLED LATIN SMALL LETTER D
  17035.     "\u24D4":"(e)", // CIRCLED LATIN SMALL LETTER E
  17036.     "\u24D5":"(f)", // CIRCLED LATIN SMALL LETTER F
  17037.     "\u24D6":"(g)", // CIRCLED LATIN SMALL LETTER G
  17038.     "\u24D7":"(h)", // CIRCLED LATIN SMALL LETTER H
  17039.     "\u24D8":"(i)", // CIRCLED LATIN SMALL LETTER I
  17040.     "\u24D9":"(j)", // CIRCLED LATIN SMALL LETTER J
  17041.     "\u24DA":"(k)", // CIRCLED LATIN SMALL LETTER K
  17042.     "\u24DB":"(l)", // CIRCLED LATIN SMALL LETTER L
  17043.     "\u24DC":"(m)", // CIRCLED LATIN SMALL LETTER M
  17044.     "\u24DD":"(n)", // CIRCLED LATIN SMALL LETTER N
  17045.     "\u24DE":"(o)", // CIRCLED LATIN SMALL LETTER O
  17046.     "\u24DF":"(p)", // CIRCLED LATIN SMALL LETTER P
  17047.     "\u24E0":"(q)", // CIRCLED LATIN SMALL LETTER Q
  17048.     "\u24E1":"(r)", // CIRCLED LATIN SMALL LETTER R
  17049.     "\u24E2":"(s)", // CIRCLED LATIN SMALL LETTER S
  17050.     "\u24E3":"(t)", // CIRCLED LATIN SMALL LETTER T
  17051.     "\u24E4":"(u)", // CIRCLED LATIN SMALL LETTER U
  17052.     "\u24E5":"(v)", // CIRCLED LATIN SMALL LETTER V
  17053.     "\u24E6":"(w)", // CIRCLED LATIN SMALL LETTER W
  17054.     "\u24E7":"(x)", // CIRCLED LATIN SMALL LETTER X
  17055.     "\u24E8":"(y)", // CIRCLED LATIN SMALL LETTER Y
  17056.     "\u24E9":"(z)", // CIRCLED LATIN SMALL LETTER Z
  17057.     "\u24EA":"(0)", // CIRCLED DIGIT ZERO
  17058.     "\u2500":"-", // BOX DRAWINGS LIGHT HORIZONTAL
  17059.     "\u2501":"=", // BOX DRAWINGS HEAVY HORIZONTAL
  17060.     "\u2502":"|", // BOX DRAWINGS LIGHT VERTICAL
  17061.     "\u2503":"|", // BOX DRAWINGS HEAVY VERTICAL
  17062.     "\u2504":"-", // BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
  17063.     "\u2505":"=", // BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
  17064.     "\u2506":"|", // BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
  17065.     "\u2507":"|", // BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
  17066.     "\u2508":"-", // BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
  17067.     "\u2509":"=", // BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
  17068.     "\u250A":"|", // BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
  17069.     "\u250B":"|", // BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
  17070.     "\u250C":"+", // BOX DRAWINGS LIGHT DOWN AND RIGHT
  17071.     "\u250D":"+", // BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
  17072.     "\u250E":"+", // BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
  17073.     "\u250F":"+", // BOX DRAWINGS HEAVY DOWN AND RIGHT
  17074.     "\u2510":"+", // BOX DRAWINGS LIGHT DOWN AND LEFT
  17075.     "\u2511":"+", // BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
  17076.     "\u2512":"+", // BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
  17077.     "\u2513":"+", // BOX DRAWINGS HEAVY DOWN AND LEFT
  17078.     "\u2514":"+", // BOX DRAWINGS LIGHT UP AND RIGHT
  17079.     "\u2515":"+", // BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
  17080.     "\u2516":"+", // BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
  17081.     "\u2517":"+", // BOX DRAWINGS HEAVY UP AND RIGHT
  17082.     "\u2518":"+", // BOX DRAWINGS LIGHT UP AND LEFT
  17083.     "\u2519":"+", // BOX DRAWINGS UP LIGHT AND LEFT HEAVY
  17084.     "\u251A":"+", // BOX DRAWINGS UP HEAVY AND LEFT LIGHT
  17085.     "\u251B":"+", // BOX DRAWINGS HEAVY UP AND LEFT
  17086.     "\u251C":"+", // BOX DRAWINGS LIGHT VERTICAL AND RIGHT
  17087.     "\u251D":"+", // BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
  17088.     "\u251E":"+", // BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
  17089.     "\u251F":"+", // BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
  17090.     "\u2520":"+", // BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
  17091.     "\u2521":"+", // BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
  17092.     "\u2522":"+", // BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
  17093.     "\u2523":"+", // BOX DRAWINGS HEAVY VERTICAL AND RIGHT
  17094.     "\u2524":"+", // BOX DRAWINGS LIGHT VERTICAL AND LEFT
  17095.     "\u2525":"+", // BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
  17096.     "\u2526":"+", // BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
  17097.     "\u2527":"+", // BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
  17098.     "\u2528":"+", // BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
  17099.     "\u2529":"+", // BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
  17100.     "\u252A":"+", // BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
  17101.     "\u252B":"+", // BOX DRAWINGS HEAVY VERTICAL AND LEFT
  17102.     "\u252C":"+", // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
  17103.     "\u252D":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
  17104.     "\u252E":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
  17105.     "\u252F":"+", // BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
  17106.     "\u2530":"+", // BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
  17107.     "\u2531":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
  17108.     "\u2532":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
  17109.     "\u2533":"+", // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
  17110.     "\u2534":"+", // BOX DRAWINGS LIGHT UP AND HORIZONTAL
  17111.     "\u2535":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
  17112.     "\u2536":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
  17113.     "\u2537":"+", // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
  17114.     "\u2538":"+", // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
  17115.     "\u2539":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
  17116.     "\u253A":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
  17117.     "\u253B":"+", // BOX DRAWINGS HEAVY UP AND HORIZONTAL
  17118.     "\u253C":"+", // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
  17119.     "\u253D":"+", // BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
  17120.     "\u253E":"+", // BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
  17121.     "\u253F":"+", // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
  17122.     "\u2540":"+", // BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
  17123.     "\u2541":"+", // BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
  17124.     "\u2542":"+", // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
  17125.     "\u2543":"+", // BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
  17126.     "\u2544":"+", // BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
  17127.     "\u2545":"+", // BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
  17128.     "\u2546":"+", // BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
  17129.     "\u2547":"+", // BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
  17130.     "\u2548":"+", // BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
  17131.     "\u2549":"+", // BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
  17132.     "\u254A":"+", // BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
  17133.     "\u254B":"+", // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
  17134.     "\u254C":"-", // BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
  17135.     "\u254D":"=", // BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
  17136.     "\u254E":"|", // BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
  17137.     "\u254F":"|", // BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
  17138.     "\u2550":"=", // BOX DRAWINGS DOUBLE HORIZONTAL
  17139.     "\u2551":"|", // BOX DRAWINGS DOUBLE VERTICAL
  17140.     "\u2552":"+", // BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
  17141.     "\u2553":"+", // BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
  17142.     "\u2554":"+", // BOX DRAWINGS DOUBLE DOWN AND RIGHT
  17143.     "\u2555":"+", // BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
  17144.     "\u2556":"+", // BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
  17145.     "\u2557":"+", // BOX DRAWINGS DOUBLE DOWN AND LEFT
  17146.     "\u2558":"+", // BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
  17147.     "\u2559":"+", // BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
  17148.     "\u255A":"+", // BOX DRAWINGS DOUBLE UP AND RIGHT
  17149.     "\u255B":"+", // BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
  17150.     "\u255C":"+", // BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
  17151.     "\u255D":"+", // BOX DRAWINGS DOUBLE UP AND LEFT
  17152.     "\u255E":"+", // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
  17153.     "\u255F":"+", // BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
  17154.     "\u2560":"+", // BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
  17155.     "\u2561":"+", // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
  17156.     "\u2562":"+", // BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
  17157.     "\u2563":"+", // BOX DRAWINGS DOUBLE VERTICAL AND LEFT
  17158.     "\u2564":"+", // BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
  17159.     "\u2565":"+", // BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
  17160.     "\u2566":"+", // BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
  17161.     "\u2567":"+", // BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
  17162.     "\u2568":"+", // BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
  17163.     "\u2569":"+", // BOX DRAWINGS DOUBLE UP AND HORIZONTAL
  17164.     "\u256A":"+", // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
  17165.     "\u256B":"+", // BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
  17166.     "\u256C":"+", // BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
  17167.     "\u256D":"+", // BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
  17168.     "\u256E":"+", // BOX DRAWINGS LIGHT ARC DOWN AND LEFT
  17169.     "\u256F":"+", // BOX DRAWINGS LIGHT ARC UP AND LEFT
  17170.     "\u2570":"+", // BOX DRAWINGS LIGHT ARC UP AND RIGHT
  17171.     "\u2571":"/", // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
  17172.     "\u2572":"\\", // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
  17173.     "\u2573":"X", // BOX DRAWINGS LIGHT DIAGONAL CROSS
  17174.     "\u257C":"-", // BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT
  17175.     "\u257D":"|", // BOX DRAWINGS LIGHT UP AND HEAVY DOWN
  17176.     "\u257E":"-", // BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT
  17177.     "\u257F":"|", // BOX DRAWINGS HEAVY UP AND LIGHT DOWN
  17178.     "\u25CB":"o", // WHITE CIRCLE
  17179.     "\u25E6":"{\\textopenbullet}", // WHITE BULLET
  17180.     "\u2605":"*", // BLACK STAR
  17181.     "\u2606":"*", // WHITE STAR
  17182.     "\u2612":"X", // BALLOT BOX WITH X
  17183.     "\u2613":"X", // SALTIRE
  17184.     "\u2639":":-(", // WHITE FROWNING FACE
  17185.     "\u263A":":-)", // WHITE SMILING FACE
  17186.     "\u263B":"(-:", // BLACK SMILING FACE
  17187.     "\u266D":"b", // MUSIC FLAT SIGN
  17188.     "\u266F":"$\\#$", // MUSIC SHARP SIGN
  17189.     "\u2701":"$\\%<$", // UPPER BLADE SCISSORS
  17190.     "\u2702":"$\\%<$", // BLACK SCISSORS
  17191.     "\u2703":"$\\%<$", // LOWER BLADE SCISSORS
  17192.     "\u2704":"$\\%<$", // WHITE SCISSORS
  17193.     "\u270C":"V", // VICTORY HAND
  17194.     "\u2713":"v", // CHECK MARK
  17195.     "\u2714":"V", // HEAVY CHECK MARK
  17196.     "\u2715":"x", // MULTIPLICATION X
  17197.     "\u2716":"x", // HEAVY MULTIPLICATION X
  17198.     "\u2717":"X", // BALLOT X
  17199.     "\u2718":"X", // HEAVY BALLOT X
  17200.     "\u2719":"+", // OUTLINED GREEK CROSS
  17201.     "\u271A":"+", // HEAVY GREEK CROSS
  17202.     "\u271B":"+", // OPEN CENTRE CROSS
  17203.     "\u271C":"+", // HEAVY OPEN CENTRE CROSS
  17204.     "\u271D":"+", // LATIN CROSS
  17205.     "\u271E":"+", // SHADOWED WHITE LATIN CROSS
  17206.     "\u271F":"+", // OUTLINED LATIN CROSS
  17207.     "\u2720":"+", // MALTESE CROSS
  17208.     "\u2721":"*", // STAR OF DAVID
  17209.     "\u2722":"+", // FOUR TEARDROP-SPOKED ASTERISK
  17210.     "\u2723":"+", // FOUR BALLOON-SPOKED ASTERISK
  17211.     "\u2724":"+", // HEAVY FOUR BALLOON-SPOKED ASTERISK
  17212.     "\u2725":"+", // FOUR CLUB-SPOKED ASTERISK
  17213.     "\u2726":"+", // BLACK FOUR POINTED STAR
  17214.     "\u2727":"+", // WHITE FOUR POINTED STAR
  17215.     "\u2729":"*", // STRESS OUTLINED WHITE STAR
  17216.     "\u272A":"*", // CIRCLED WHITE STAR
  17217.     "\u272B":"*", // OPEN CENTRE BLACK STAR
  17218.     "\u272C":"*", // BLACK CENTRE WHITE STAR
  17219.     "\u272D":"*", // OUTLINED BLACK STAR
  17220.     "\u272E":"*", // HEAVY OUTLINED BLACK STAR
  17221.     "\u272F":"*", // PINWHEEL STAR
  17222.     "\u2730":"*", // SHADOWED WHITE STAR
  17223.     "\u2731":"*", // HEAVY ASTERISK
  17224.     "\u2732":"*", // OPEN CENTRE ASTERISK
  17225.     "\u2733":"*", // EIGHT SPOKED ASTERISK
  17226.     "\u2734":"*", // EIGHT POINTED BLACK STAR
  17227.     "\u2735":"*", // EIGHT POINTED PINWHEEL STAR
  17228.     "\u2736":"*", // SIX POINTED BLACK STAR
  17229.     "\u2737":"*", // EIGHT POINTED RECTILINEAR BLACK STAR
  17230.     "\u2738":"*", // HEAVY EIGHT POINTED RECTILINEAR BLACK STAR
  17231.     "\u2739":"*", // TWELVE POINTED BLACK STAR
  17232.     "\u273A":"*", // SIXTEEN POINTED ASTERISK
  17233.     "\u273B":"*", // TEARDROP-SPOKED ASTERISK
  17234.     "\u273C":"*", // OPEN CENTRE TEARDROP-SPOKED ASTERISK
  17235.     "\u273D":"*", // HEAVY TEARDROP-SPOKED ASTERISK
  17236.     "\u273E":"*", // SIX PETALLED BLACK AND WHITE FLORETTE
  17237.     "\u273F":"*", // BLACK FLORETTE
  17238.     "\u2740":"*", // WHITE FLORETTE
  17239.     "\u2741":"*", // EIGHT PETALLED OUTLINED BLACK FLORETTE
  17240.     "\u2742":"*", // CIRCLED OPEN CENTRE EIGHT POINTED STAR
  17241.     "\u2743":"*", // HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
  17242.     "\u2744":"*", // SNOWFLAKE
  17243.     "\u2745":"*", // TIGHT TRIFOLIATE SNOWFLAKE
  17244.     "\u2746":"*", // HEAVY CHEVRON SNOWFLAKE
  17245.     "\u2747":"*", // SPARKLE
  17246.     "\u2748":"*", // HEAVY SPARKLE
  17247.     "\u2749":"*", // BALLOON-SPOKED ASTERISK
  17248.     "\u274A":"*", // EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
  17249.     "\u274B":"*", // HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
  17250.     "\uFB00":"ff", // LATIN SMALL LIGATURE FF
  17251.     "\uFB01":"fi", // LATIN SMALL LIGATURE FI
  17252.     "\uFB02":"fl", // LATIN SMALL LIGATURE FL
  17253.     "\uFB03":"ffi", // LATIN SMALL LIGATURE FFI
  17254.     "\uFB04":"ffl", // LATIN SMALL LIGATURE FFL
  17255.     "\uFB05":"st", // LATIN SMALL LIGATURE LONG S T
  17256.     "\uFB06":"st", // LATIN SMALL LIGATURE ST
  17257. /* Derived accented characters */
  17258.     "\u00C0":"\\`{A}", // LATIN CAPITAL LETTER A WITH GRAVE
  17259.     "\u00C1":"\\''{A}", // LATIN CAPITAL LETTER A WITH ACUTE
  17260.     "\u00C2":"\\^{A}", // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
  17261.     "\u00C3":"\\~{A}", // LATIN CAPITAL LETTER A WITH TILDE
  17262.     "\u00C4":"\\~{A}", // LATIN CAPITAL LETTER A WITH DIAERESIS
  17263.     "\u00C7":"\\c{C}", // LATIN CAPITAL LETTER C WITH CEDILLA
  17264.     "\u00C8":"\\`{E}", // LATIN CAPITAL LETTER E WITH GRAVE
  17265.     "\u00C9":"\\''{E}", // LATIN CAPITAL LETTER E WITH ACUTE
  17266.     "\u00CA":"\\^{E}", // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
  17267.     "\u00CB":"\\~{E}", // LATIN CAPITAL LETTER E WITH DIAERESIS
  17268.     "\u00CC":"\\`{I}", // LATIN CAPITAL LETTER I WITH GRAVE
  17269.     "\u00CD":"\\''{I}", // LATIN CAPITAL LETTER I WITH ACUTE
  17270.     "\u00CE":"\\^{I}", // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
  17271.     "\u00CF":"\\~{I}", // LATIN CAPITAL LETTER I WITH DIAERESIS
  17272.     "\u00D1":"\\~{N}", // LATIN CAPITAL LETTER N WITH TILDE
  17273.     "\u00D2":"\\`{O}", // LATIN CAPITAL LETTER O WITH GRAVE
  17274.     "\u00D3":"\\''{O}", // LATIN CAPITAL LETTER O WITH ACUTE
  17275.     "\u00D4":"\\^{O}", // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
  17276.     "\u00D5":"\\~{O}", // LATIN CAPITAL LETTER O WITH TILDE
  17277.     "\u00D6":"\\~{O}", // LATIN CAPITAL LETTER O WITH DIAERESIS
  17278.     "\u00D9":"\\`{U}", // LATIN CAPITAL LETTER U WITH GRAVE
  17279.     "\u00DA":"\\''{U}", // LATIN CAPITAL LETTER U WITH ACUTE
  17280.     "\u00DB":"\\^{U}", // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
  17281.     "\u00DC":"\\~{U}", // LATIN CAPITAL LETTER U WITH DIAERESIS
  17282.     "\u00DD":"\\''{Y}", // LATIN CAPITAL LETTER Y WITH ACUTE
  17283.     "\u00E0":"\\`{a}", // LATIN SMALL LETTER A WITH GRAVE
  17284.     "\u00E1":"\\''{a}", // LATIN SMALL LETTER A WITH ACUTE
  17285.     "\u00E2":"\\^{a}", // LATIN SMALL LETTER A WITH CIRCUMFLEX
  17286.     "\u00E3":"\\~{a}", // LATIN SMALL LETTER A WITH TILDE
  17287.     "\u00E4":"\\~{a}", // LATIN SMALL LETTER A WITH DIAERESIS
  17288.     "\u00E7":"\\c{c}", // LATIN SMALL LETTER C WITH CEDILLA
  17289.     "\u00E8":"\\`{e}", // LATIN SMALL LETTER E WITH GRAVE
  17290.     "\u00E9":"\\''{e}", // LATIN SMALL LETTER E WITH ACUTE
  17291.     "\u00EA":"\\^{e}", // LATIN SMALL LETTER E WITH CIRCUMFLEX
  17292.     "\u00EB":"\\~{e}", // LATIN SMALL LETTER E WITH DIAERESIS
  17293.     "\u00EC":"\\`{i}", // LATIN SMALL LETTER I WITH GRAVE
  17294.     "\u00ED":"\\''{i}", // LATIN SMALL LETTER I WITH ACUTE
  17295.     "\u00EE":"\\^{i}", // LATIN SMALL LETTER I WITH CIRCUMFLEX
  17296.     "\u00EF":"\\~{i}", // LATIN SMALL LETTER I WITH DIAERESIS
  17297.     "\u00F1":"\\~{n}", // LATIN SMALL LETTER N WITH TILDE
  17298.     "\u00F2":"\\`{o}", // LATIN SMALL LETTER O WITH GRAVE
  17299.     "\u00F3":"\\''{o}", // LATIN SMALL LETTER O WITH ACUTE
  17300.     "\u00F4":"\\^{o}", // LATIN SMALL LETTER O WITH CIRCUMFLEX
  17301.     "\u00F5":"\\~{o}", // LATIN SMALL LETTER O WITH TILDE
  17302.     "\u00F6":"\\~{o}", // LATIN SMALL LETTER O WITH DIAERESIS
  17303.     "\u00F9":"\\`{u}", // LATIN SMALL LETTER U WITH GRAVE
  17304.     "\u00FA":"\\''{u}", // LATIN SMALL LETTER U WITH ACUTE
  17305.     "\u00FB":"\\^{u}", // LATIN SMALL LETTER U WITH CIRCUMFLEX
  17306.     "\u00FC":"\\~{u}", // LATIN SMALL LETTER U WITH DIAERESIS
  17307.     "\u00FD":"\\''{y}", // LATIN SMALL LETTER Y WITH ACUTE
  17308.     "\u00FF":"\\~{y}", // LATIN SMALL LETTER Y WITH DIAERESIS
  17309.     "\u0100":"\\={A}", // LATIN CAPITAL LETTER A WITH MACRON
  17310.     "\u0101":"\\={a}", // LATIN SMALL LETTER A WITH MACRON
  17311.     "\u0102":"\\u{A}", // LATIN CAPITAL LETTER A WITH BREVE
  17312.     "\u0103":"\\u{a}", // LATIN SMALL LETTER A WITH BREVE
  17313.     "\u0104":"\\k{A}", // LATIN CAPITAL LETTER A WITH OGONEK
  17314.     "\u0105":"\\k{a}", // LATIN SMALL LETTER A WITH OGONEK
  17315.     "\u0106":"\\''{C}", // LATIN CAPITAL LETTER C WITH ACUTE
  17316.     "\u0107":"\\''{c}", // LATIN SMALL LETTER C WITH ACUTE
  17317.     "\u0108":"\\^{C}", // LATIN CAPITAL LETTER C WITH CIRCUMFLEX
  17318.     "\u0109":"\\^{c}", // LATIN SMALL LETTER C WITH CIRCUMFLEX
  17319.     "\u010A":"\\.{C}", // LATIN CAPITAL LETTER C WITH DOT ABOVE
  17320.     "\u010B":"\\.{c}", // LATIN SMALL LETTER C WITH DOT ABOVE
  17321.     "\u010C":"\\v{C}", // LATIN CAPITAL LETTER C WITH CARON
  17322.     "\u010D":"\\v{c}", // LATIN SMALL LETTER C WITH CARON
  17323.     "\u010E":"\\v{D}", // LATIN CAPITAL LETTER D WITH CARON
  17324.     "\u010F":"\\v{d}", // LATIN SMALL LETTER D WITH CARON
  17325.     "\u0112":"\\={E}", // LATIN CAPITAL LETTER E WITH MACRON
  17326.     "\u0113":"\\={e}", // LATIN SMALL LETTER E WITH MACRON
  17327.     "\u0114":"\\u{E}", // LATIN CAPITAL LETTER E WITH BREVE
  17328.     "\u0115":"\\u{e}", // LATIN SMALL LETTER E WITH BREVE
  17329.     "\u0116":"\\.{E}", // LATIN CAPITAL LETTER E WITH DOT ABOVE
  17330.     "\u0117":"\\.{e}", // LATIN SMALL LETTER E WITH DOT ABOVE
  17331.     "\u0118":"\\k{E}", // LATIN CAPITAL LETTER E WITH OGONEK
  17332.     "\u0119":"\\k{e}", // LATIN SMALL LETTER E WITH OGONEK
  17333.     "\u011A":"\\v{E}", // LATIN CAPITAL LETTER E WITH CARON
  17334.     "\u011B":"\\v{e}", // LATIN SMALL LETTER E WITH CARON
  17335.     "\u011C":"\\^{G}", // LATIN CAPITAL LETTER G WITH CIRCUMFLEX
  17336.     "\u011D":"\\^{g}", // LATIN SMALL LETTER G WITH CIRCUMFLEX
  17337.     "\u011E":"\\u{G}", // LATIN CAPITAL LETTER G WITH BREVE
  17338.     "\u011F":"\\u{g}", // LATIN SMALL LETTER G WITH BREVE
  17339.     "\u0120":"\\.{G}", // LATIN CAPITAL LETTER G WITH DOT ABOVE
  17340.     "\u0121":"\\.{g}", // LATIN SMALL LETTER G WITH DOT ABOVE
  17341.     "\u0122":"\\c{G}", // LATIN CAPITAL LETTER G WITH CEDILLA
  17342.     "\u0123":"\\c{g}", // LATIN SMALL LETTER G WITH CEDILLA
  17343.     "\u0124":"\\^{H}", // LATIN CAPITAL LETTER H WITH CIRCUMFLEX
  17344.     "\u0125":"\\^{h}", // LATIN SMALL LETTER H WITH CIRCUMFLEX
  17345.     "\u0128":"\\~{I}", // LATIN CAPITAL LETTER I WITH TILDE
  17346.     "\u0129":"\\~{i}", // LATIN SMALL LETTER I WITH TILDE
  17347.     "\u012A":"\\={I}", // LATIN CAPITAL LETTER I WITH MACRON
  17348.     "\u012B":"\\={i}", // LATIN SMALL LETTER I WITH MACRON
  17349.     "\u012C":"\\u{I}", // LATIN CAPITAL LETTER I WITH BREVE
  17350.     "\u012D":"\\u{i}", // LATIN SMALL LETTER I WITH BREVE
  17351.     "\u012E":"\\k{I}", // LATIN CAPITAL LETTER I WITH OGONEK
  17352.     "\u012F":"\\k{i}", // LATIN SMALL LETTER I WITH OGONEK
  17353.     "\u0130":"\\.{I}", // LATIN CAPITAL LETTER I WITH DOT ABOVE
  17354.     "\u0134":"\\^{J}", // LATIN CAPITAL LETTER J WITH CIRCUMFLEX
  17355.     "\u0135":"\\^{j}", // LATIN SMALL LETTER J WITH CIRCUMFLEX
  17356.     "\u0136":"\\c{K}", // LATIN CAPITAL LETTER K WITH CEDILLA
  17357.     "\u0137":"\\c{k}", // LATIN SMALL LETTER K WITH CEDILLA
  17358.     "\u0139":"\\''{L}", // LATIN CAPITAL LETTER L WITH ACUTE
  17359.     "\u013A":"\\''{l}", // LATIN SMALL LETTER L WITH ACUTE
  17360.     "\u013B":"\\c{L}", // LATIN CAPITAL LETTER L WITH CEDILLA
  17361.     "\u013C":"\\c{l}", // LATIN SMALL LETTER L WITH CEDILLA
  17362.     "\u013D":"\\v{L}", // LATIN CAPITAL LETTER L WITH CARON
  17363.     "\u013E":"\\v{l}", // LATIN SMALL LETTER L WITH CARON
  17364.     "\u0143":"\\''{N}", // LATIN CAPITAL LETTER N WITH ACUTE
  17365.     "\u0144":"\\''{n}", // LATIN SMALL LETTER N WITH ACUTE
  17366.     "\u0145":"\\c{N}", // LATIN CAPITAL LETTER N WITH CEDILLA
  17367.     "\u0146":"\\c{n}", // LATIN SMALL LETTER N WITH CEDILLA
  17368.     "\u0147":"\\v{N}", // LATIN CAPITAL LETTER N WITH CARON
  17369.     "\u0148":"\\v{n}", // LATIN SMALL LETTER N WITH CARON
  17370.     "\u014C":"\\={O}", // LATIN CAPITAL LETTER O WITH MACRON
  17371.     "\u014D":"\\={o}", // LATIN SMALL LETTER O WITH MACRON
  17372.     "\u014E":"\\u{O}", // LATIN CAPITAL LETTER O WITH BREVE
  17373.     "\u014F":"\\u{o}", // LATIN SMALL LETTER O WITH BREVE
  17374.     "\u0150":"\\H{O}", // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
  17375.     "\u0151":"\\H{o}", // LATIN SMALL LETTER O WITH DOUBLE ACUTE
  17376.     "\u0154":"\\''{R}", // LATIN CAPITAL LETTER R WITH ACUTE
  17377.     "\u0155":"\\''{r}", // LATIN SMALL LETTER R WITH ACUTE
  17378.     "\u0156":"\\c{R}", // LATIN CAPITAL LETTER R WITH CEDILLA
  17379.     "\u0157":"\\c{r}", // LATIN SMALL LETTER R WITH CEDILLA
  17380.     "\u0158":"\\v{R}", // LATIN CAPITAL LETTER R WITH CARON
  17381.     "\u0159":"\\v{r}", // LATIN SMALL LETTER R WITH CARON
  17382.     "\u015A":"\\''{S}", // LATIN CAPITAL LETTER S WITH ACUTE
  17383.     "\u015B":"\\''{s}", // LATIN SMALL LETTER S WITH ACUTE
  17384.     "\u015C":"\\^{S}", // LATIN CAPITAL LETTER S WITH CIRCUMFLEX
  17385.     "\u015D":"\\^{s}", // LATIN SMALL LETTER S WITH CIRCUMFLEX
  17386.     "\u015E":"\\c{S}", // LATIN CAPITAL LETTER S WITH CEDILLA
  17387.     "\u015F":"\\c{s}", // LATIN SMALL LETTER S WITH CEDILLA
  17388.     "\u0160":"\\v{S}", // LATIN CAPITAL LETTER S WITH CARON
  17389.     "\u0161":"\\v{s}", // LATIN SMALL LETTER S WITH CARON
  17390.     "\u0162":"\\c{T}", // LATIN CAPITAL LETTER T WITH CEDILLA
  17391.     "\u0163":"\\c{t}", // LATIN SMALL LETTER T WITH CEDILLA
  17392.     "\u0164":"\\v{T}", // LATIN CAPITAL LETTER T WITH CARON
  17393.     "\u0165":"\\v{t}", // LATIN SMALL LETTER T WITH CARON
  17394.     "\u0168":"\\~{U}", // LATIN CAPITAL LETTER U WITH TILDE
  17395.     "\u0169":"\\~{u}", // LATIN SMALL LETTER U WITH TILDE
  17396.     "\u016A":"\\={U}", // LATIN CAPITAL LETTER U WITH MACRON
  17397.     "\u016B":"\\={u}", // LATIN SMALL LETTER U WITH MACRON
  17398.     "\u016C":"\\u{U}", // LATIN CAPITAL LETTER U WITH BREVE
  17399.     "\u016D":"\\u{u}", // LATIN SMALL LETTER U WITH BREVE
  17400.     "\u0170":"\\H{U}", // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
  17401.     "\u0171":"\\H{u}", // LATIN SMALL LETTER U WITH DOUBLE ACUTE
  17402.     "\u0172":"\\k{U}", // LATIN CAPITAL LETTER U WITH OGONEK
  17403.     "\u0173":"\\k{u}", // LATIN SMALL LETTER U WITH OGONEK
  17404.     "\u0174":"\\^{W}", // LATIN CAPITAL LETTER W WITH CIRCUMFLEX
  17405.     "\u0175":"\\^{w}", // LATIN SMALL LETTER W WITH CIRCUMFLEX
  17406.     "\u0176":"\\^{Y}", // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
  17407.     "\u0177":"\\^{y}", // LATIN SMALL LETTER Y WITH CIRCUMFLEX
  17408.     "\u0178":"\\~{Y}", // LATIN CAPITAL LETTER Y WITH DIAERESIS
  17409.     "\u0179":"\\''{Z}", // LATIN CAPITAL LETTER Z WITH ACUTE
  17410.     "\u017A":"\\''{z}", // LATIN SMALL LETTER Z WITH ACUTE
  17411.     "\u017B":"\\.{Z}", // LATIN CAPITAL LETTER Z WITH DOT ABOVE
  17412.     "\u017C":"\\.{z}", // LATIN SMALL LETTER Z WITH DOT ABOVE
  17413.     "\u017D":"\\v{Z}", // LATIN CAPITAL LETTER Z WITH CARON
  17414.     "\u017E":"\\v{z}", // LATIN SMALL LETTER Z WITH CARON
  17415.     "\u01CD":"\\v{A}", // LATIN CAPITAL LETTER A WITH CARON
  17416.     "\u01CE":"\\v{a}", // LATIN SMALL LETTER A WITH CARON
  17417.     "\u01CF":"\\v{I}", // LATIN CAPITAL LETTER I WITH CARON
  17418.     "\u01D0":"\\v{i}", // LATIN SMALL LETTER I WITH CARON
  17419.     "\u01D1":"\\v{O}", // LATIN CAPITAL LETTER O WITH CARON
  17420.     "\u01D2":"\\v{o}", // LATIN SMALL LETTER O WITH CARON
  17421.     "\u01D3":"\\v{U}", // LATIN CAPITAL LETTER U WITH CARON
  17422.     "\u01D4":"\\v{u}", // LATIN SMALL LETTER U WITH CARON
  17423.     "\u01E6":"\\v{G}", // LATIN CAPITAL LETTER G WITH CARON
  17424.     "\u01E7":"\\v{g}", // LATIN SMALL LETTER G WITH CARON
  17425.     "\u01E8":"\\v{K}", // LATIN CAPITAL LETTER K WITH CARON
  17426.     "\u01E9":"\\v{k}", // LATIN SMALL LETTER K WITH CARON
  17427.     "\u01EA":"\\k{O}", // LATIN CAPITAL LETTER O WITH OGONEK
  17428.     "\u01EB":"\\k{o}", // LATIN SMALL LETTER O WITH OGONEK
  17429.     "\u01F0":"\\v{j}", // LATIN SMALL LETTER J WITH CARON
  17430.     "\u01F4":"\\''{G}", // LATIN CAPITAL LETTER G WITH ACUTE
  17431.     "\u01F5":"\\''{g}", // LATIN SMALL LETTER G WITH ACUTE
  17432.     "\u1E02":"\\.{B}", // LATIN CAPITAL LETTER B WITH DOT ABOVE
  17433.     "\u1E03":"\\.{b}", // LATIN SMALL LETTER B WITH DOT ABOVE
  17434.     "\u1E04":"\\d{B}", // LATIN CAPITAL LETTER B WITH DOT BELOW
  17435.     "\u1E05":"\\d{b}", // LATIN SMALL LETTER B WITH DOT BELOW
  17436.     "\u1E06":"\\b{B}", // LATIN CAPITAL LETTER B WITH LINE BELOW
  17437.     "\u1E07":"\\b{b}", // LATIN SMALL LETTER B WITH LINE BELOW
  17438.     "\u1E0A":"\\.{D}", // LATIN CAPITAL LETTER D WITH DOT ABOVE
  17439.     "\u1E0B":"\\.{d}", // LATIN SMALL LETTER D WITH DOT ABOVE
  17440.     "\u1E0C":"\\d{D}", // LATIN CAPITAL LETTER D WITH DOT BELOW
  17441.     "\u1E0D":"\\d{d}", // LATIN SMALL LETTER D WITH DOT BELOW
  17442.     "\u1E0E":"\\b{D}", // LATIN CAPITAL LETTER D WITH LINE BELOW
  17443.     "\u1E0F":"\\b{d}", // LATIN SMALL LETTER D WITH LINE BELOW
  17444.     "\u1E10":"\\c{D}", // LATIN CAPITAL LETTER D WITH CEDILLA
  17445.     "\u1E11":"\\c{d}", // LATIN SMALL LETTER D WITH CEDILLA
  17446.     "\u1E1E":"\\.{F}", // LATIN CAPITAL LETTER F WITH DOT ABOVE
  17447.     "\u1E1F":"\\.{f}", // LATIN SMALL LETTER F WITH DOT ABOVE
  17448.     "\u1E20":"\\={G}", // LATIN CAPITAL LETTER G WITH MACRON
  17449.     "\u1E21":"\\={g}", // LATIN SMALL LETTER G WITH MACRON
  17450.     "\u1E22":"\\.{H}", // LATIN CAPITAL LETTER H WITH DOT ABOVE
  17451.     "\u1E23":"\\.{h}", // LATIN SMALL LETTER H WITH DOT ABOVE
  17452.     "\u1E24":"\\d{H}", // LATIN CAPITAL LETTER H WITH DOT BELOW
  17453.     "\u1E25":"\\d{h}", // LATIN SMALL LETTER H WITH DOT BELOW
  17454.     "\u1E26":"\\~{H}", // LATIN CAPITAL LETTER H WITH DIAERESIS
  17455.     "\u1E27":"\\~{h}", // LATIN SMALL LETTER H WITH DIAERESIS
  17456.     "\u1E28":"\\c{H}", // LATIN CAPITAL LETTER H WITH CEDILLA
  17457.     "\u1E29":"\\c{h}", // LATIN SMALL LETTER H WITH CEDILLA
  17458.     "\u1E30":"\\''{K}", // LATIN CAPITAL LETTER K WITH ACUTE
  17459.     "\u1E31":"\\''{k}", // LATIN SMALL LETTER K WITH ACUTE
  17460.     "\u1E32":"\\d{K}", // LATIN CAPITAL LETTER K WITH DOT BELOW
  17461.     "\u1E33":"\\d{k}", // LATIN SMALL LETTER K WITH DOT BELOW
  17462.     "\u1E34":"\\b{K}", // LATIN CAPITAL LETTER K WITH LINE BELOW
  17463.     "\u1E35":"\\b{k}", // LATIN SMALL LETTER K WITH LINE BELOW
  17464.     "\u1E36":"\\d{L}", // LATIN CAPITAL LETTER L WITH DOT BELOW
  17465.     "\u1E37":"\\d{l}", // LATIN SMALL LETTER L WITH DOT BELOW
  17466.     "\u1E3A":"\\b{L}", // LATIN CAPITAL LETTER L WITH LINE BELOW
  17467.     "\u1E3B":"\\b{l}", // LATIN SMALL LETTER L WITH LINE BELOW
  17468.     "\u1E3E":"\\''{M}", // LATIN CAPITAL LETTER M WITH ACUTE
  17469.     "\u1E3F":"\\''{m}", // LATIN SMALL LETTER M WITH ACUTE
  17470.     "\u1E40":"\\.{M}", // LATIN CAPITAL LETTER M WITH DOT ABOVE
  17471.     "\u1E41":"\\.{m}", // LATIN SMALL LETTER M WITH DOT ABOVE
  17472.     "\u1E42":"\\d{M}", // LATIN CAPITAL LETTER M WITH DOT BELOW
  17473.     "\u1E43":"\\d{m}", // LATIN SMALL LETTER M WITH DOT BELOW
  17474.     "\u1E44":"\\.{N}", // LATIN CAPITAL LETTER N WITH DOT ABOVE
  17475.     "\u1E45":"\\.{n}", // LATIN SMALL LETTER N WITH DOT ABOVE
  17476.     "\u1E46":"\\d{N}", // LATIN CAPITAL LETTER N WITH DOT BELOW
  17477.     "\u1E47":"\\d{n}", // LATIN SMALL LETTER N WITH DOT BELOW
  17478.     "\u1E48":"\\b{N}", // LATIN CAPITAL LETTER N WITH LINE BELOW
  17479.     "\u1E49":"\\b{n}", // LATIN SMALL LETTER N WITH LINE BELOW
  17480.     "\u1E54":"\\''{P}", // LATIN CAPITAL LETTER P WITH ACUTE
  17481.     "\u1E55":"\\''{p}", // LATIN SMALL LETTER P WITH ACUTE
  17482.     "\u1E56":"\\.{P}", // LATIN CAPITAL LETTER P WITH DOT ABOVE
  17483.     "\u1E57":"\\.{p}", // LATIN SMALL LETTER P WITH DOT ABOVE
  17484.     "\u1E58":"\\.{R}", // LATIN CAPITAL LETTER R WITH DOT ABOVE
  17485.     "\u1E59":"\\.{r}", // LATIN SMALL LETTER R WITH DOT ABOVE
  17486.     "\u1E5A":"\\d{R}", // LATIN CAPITAL LETTER R WITH DOT BELOW
  17487.     "\u1E5B":"\\d{r}", // LATIN SMALL LETTER R WITH DOT BELOW
  17488.     "\u1E5E":"\\b{R}", // LATIN CAPITAL LETTER R WITH LINE BELOW
  17489.     "\u1E5F":"\\b{r}", // LATIN SMALL LETTER R WITH LINE BELOW
  17490.     "\u1E60":"\\.{S}", // LATIN CAPITAL LETTER S WITH DOT ABOVE
  17491.     "\u1E61":"\\.{s}", // LATIN SMALL LETTER S WITH DOT ABOVE
  17492.     "\u1E62":"\\d{S}", // LATIN CAPITAL LETTER S WITH DOT BELOW
  17493.     "\u1E63":"\\d{s}", // LATIN SMALL LETTER S WITH DOT BELOW
  17494.     "\u1E6A":"\\.{T}", // LATIN CAPITAL LETTER T WITH DOT ABOVE
  17495.     "\u1E6B":"\\.{t}", // LATIN SMALL LETTER T WITH DOT ABOVE
  17496.     "\u1E6C":"\\d{T}", // LATIN CAPITAL LETTER T WITH DOT BELOW
  17497.     "\u1E6D":"\\d{t}", // LATIN SMALL LETTER T WITH DOT BELOW
  17498.     "\u1E6E":"\\b{T}", // LATIN CAPITAL LETTER T WITH LINE BELOW
  17499.     "\u1E6F":"\\b{t}", // LATIN SMALL LETTER T WITH LINE BELOW
  17500.     "\u1E7C":"\\~{V}", // LATIN CAPITAL LETTER V WITH TILDE
  17501.     "\u1E7D":"\\~{v}", // LATIN SMALL LETTER V WITH TILDE
  17502.     "\u1E7E":"\\d{V}", // LATIN CAPITAL LETTER V WITH DOT BELOW
  17503.     "\u1E7F":"\\d{v}", // LATIN SMALL LETTER V WITH DOT BELOW
  17504.     "\u1E80":"\\`{W}", // LATIN CAPITAL LETTER W WITH GRAVE
  17505.     "\u1E81":"\\`{w}", // LATIN SMALL LETTER W WITH GRAVE
  17506.     "\u1E82":"\\''{W}", // LATIN CAPITAL LETTER W WITH ACUTE
  17507.     "\u1E83":"\\''{w}", // LATIN SMALL LETTER W WITH ACUTE
  17508.     "\u1E84":"\\~{W}", // LATIN CAPITAL LETTER W WITH DIAERESIS
  17509.     "\u1E85":"\\~{w}", // LATIN SMALL LETTER W WITH DIAERESIS
  17510.     "\u1E86":"\\.{W}", // LATIN CAPITAL LETTER W WITH DOT ABOVE
  17511.     "\u1E87":"\\.{w}", // LATIN SMALL LETTER W WITH DOT ABOVE
  17512.     "\u1E88":"\\d{W}", // LATIN CAPITAL LETTER W WITH DOT BELOW
  17513.     "\u1E89":"\\d{w}", // LATIN SMALL LETTER W WITH DOT BELOW
  17514.     "\u1E8A":"\\.{X}", // LATIN CAPITAL LETTER X WITH DOT ABOVE
  17515.     "\u1E8B":"\\.{x}", // LATIN SMALL LETTER X WITH DOT ABOVE
  17516.     "\u1E8C":"\\~{X}", // LATIN CAPITAL LETTER X WITH DIAERESIS
  17517.     "\u1E8D":"\\~{x}", // LATIN SMALL LETTER X WITH DIAERESIS
  17518.     "\u1E8E":"\\.{Y}", // LATIN CAPITAL LETTER Y WITH DOT ABOVE
  17519.     "\u1E8F":"\\.{y}", // LATIN SMALL LETTER Y WITH DOT ABOVE
  17520.     "\u1E90":"\\^{Z}", // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
  17521.     "\u1E91":"\\^{z}", // LATIN SMALL LETTER Z WITH CIRCUMFLEX
  17522.     "\u1E92":"\\d{Z}", // LATIN CAPITAL LETTER Z WITH DOT BELOW
  17523.     "\u1E93":"\\d{z}", // LATIN SMALL LETTER Z WITH DOT BELOW
  17524.     "\u1E94":"\\b{Z}", // LATIN CAPITAL LETTER Z WITH LINE BELOW
  17525.     "\u1E95":"\\b{z}", // LATIN SMALL LETTER Z WITH LINE BELOW
  17526.     "\u1E96":"\\b{h}", // LATIN SMALL LETTER H WITH LINE BELOW
  17527.     "\u1E97":"\\~{t}", // LATIN SMALL LETTER T WITH DIAERESIS
  17528.     "\u1EA0":"\\d{A}", // LATIN CAPITAL LETTER A WITH DOT BELOW
  17529.     "\u1EA1":"\\d{a}", // LATIN SMALL LETTER A WITH DOT BELOW
  17530.     "\u1EB8":"\\d{E}", // LATIN CAPITAL LETTER E WITH DOT BELOW
  17531.     "\u1EB9":"\\d{e}", // LATIN SMALL LETTER E WITH DOT BELOW
  17532.     "\u1EBC":"\\~{E}", // LATIN CAPITAL LETTER E WITH TILDE
  17533.     "\u1EBD":"\\~{e}", // LATIN SMALL LETTER E WITH TILDE
  17534.     "\u1ECA":"\\d{I}", // LATIN CAPITAL LETTER I WITH DOT BELOW
  17535.     "\u1ECB":"\\d{i}", // LATIN SMALL LETTER I WITH DOT BELOW
  17536.     "\u1ECC":"\\d{O}", // LATIN CAPITAL LETTER O WITH DOT BELOW
  17537.     "\u1ECD":"\\d{o}", // LATIN SMALL LETTER O WITH DOT BELOW
  17538.     "\u1EE4":"\\d{U}", // LATIN CAPITAL LETTER U WITH DOT BELOW
  17539.     "\u1EE5":"\\d{u}", // LATIN SMALL LETTER U WITH DOT BELOW
  17540.     "\u1EF2":"\\`{Y}", // LATIN CAPITAL LETTER Y WITH GRAVE
  17541.     "\u1EF3":"\\`{y}", // LATIN SMALL LETTER Y WITH GRAVE
  17542.     "\u1EF4":"\\d{Y}", // LATIN CAPITAL LETTER Y WITH DOT BELOW
  17543.     "\u1EF5":"\\d{y}", // LATIN SMALL LETTER Y WITH DOT BELOW
  17544.     "\u1EF8":"\\~{Y}", // LATIN CAPITAL LETTER Y WITH TILDE
  17545.     "\u1EF9":"\\~{y}", // LATIN SMALL LETTER Y WITH TILDE
  17546.  
  17547. };
  17548.  
  17549. /* unfortunately the mapping isn''t reversible - hence this second table - sigh! */
  17550. var reversemappingTable = {
  17551.     "\u00A0":"~", // NO-BREAK SPACE
  17552.     "\u00A1":"{\\textexclamdown}", // INVERTED EXCLAMATION MARK
  17553.     "\u00A2":"{\\textcent}", // CENT SIGN
  17554.     "\u00A3":"{\\textsterling}", // POUND SIGN
  17555.     "\u00A5":"{\\textyen}", // YEN SIGN
  17556.     "\u00A6":"{\\textbrokenbar}", // BROKEN BAR
  17557.     "\u00A7":"{\\textsection}", // SECTION SIGN
  17558.     "\u00A8":"{\\textasciidieresis}", // DIAERESIS
  17559.     "\u00A9":"{\\textcopyright}", // COPYRIGHT SIGN
  17560.     "\u00AA":"{\\textordfeminine}", // FEMININE ORDINAL INDICATOR
  17561.     "\u00AB":"{\\guillemotleft}", // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
  17562.     "\u00AC":"{\\textlnot}", // NOT SIGN
  17563.     "\u00AE":"{\\textregistered}", // REGISTERED SIGN
  17564.     "\u00AF":"{\\textasciimacron}", // MACRON
  17565.     "\u00B0":"{\\textdegree}", // DEGREE SIGN
  17566.     "\u00B1":"{\\textpm}", // PLUS-MINUS SIGN
  17567.     "\u00B2":"{\\texttwosuperior}", // SUPERSCRIPT TWO
  17568.     "\u00B3":"{\\textthreesuperior}", // SUPERSCRIPT THREE
  17569.     "\u00B4":"{\\textasciiacute}", // ACUTE ACCENT
  17570.     "\u00B5":"{\\textmu}", // MICRO SIGN
  17571.     "\u00B6":"{\\textparagraph}", // PILCROW SIGN
  17572.     "\u00B7":"{\\textperiodcentered}", // MIDDLE DOT
  17573.     "\u00B8":"{\\c\\ }", // CEDILLA
  17574.     "\u00B9":"{\\textonesuperior}", // SUPERSCRIPT ONE
  17575.     "\u00BA":"{\\textordmasculine}", // MASCULINE ORDINAL INDICATOR
  17576.     "\u00BB":"{\\guillemotright}", // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
  17577.     "\u00BC":"{\\textonequarter}", // VULGAR FRACTION ONE QUARTER
  17578.     "\u00BD":"{\\textonehalf}", // VULGAR FRACTION ONE HALF
  17579.     "\u00BE":"{\\textthreequarters}", // VULGAR FRACTION THREE QUARTERS
  17580.     "\u00BF":"{\\textquestiondown}", // INVERTED QUESTION MARK
  17581.     "\u00C6":"{\\AE}", // LATIN CAPITAL LETTER AE
  17582.     "\u00D0":"{\\DH}", // LATIN CAPITAL LETTER ETH
  17583.     "\u00D7":"{\\texttimes}", // MULTIPLICATION SIGN
  17584.     "\u00DE":"{\\TH}", // LATIN CAPITAL LETTER THORN
  17585.     "\u00DF":"{\\ss}", // LATIN SMALL LETTER SHARP S
  17586.     "\u00E6":"{\\ae}", // LATIN SMALL LETTER AE
  17587.     "\u00F0":"{\\dh}", // LATIN SMALL LETTER ETH
  17588.     "\u00F7":"{\\textdiv}", // DIVISION SIGN
  17589.     "\u00FE":"{\\th}", // LATIN SMALL LETTER THORN
  17590.     "\u0131":"{\\i}", // LATIN SMALL LETTER DOTLESS I
  17591.     "\u0132":"IJ", // LATIN CAPITAL LIGATURE IJ
  17592.     "\u0133":"ij", // LATIN SMALL LIGATURE IJ
  17593.     "\u0149":"''n", // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
  17594.     "\u014A":"{\\NG}", // LATIN CAPITAL LETTER ENG
  17595.     "\u014B":"{\\ng}", // LATIN SMALL LETTER ENG
  17596.     "\u0152":"{\\OE}", // LATIN CAPITAL LIGATURE OE
  17597.     "\u0153":"{\\oe}", // LATIN SMALL LIGATURE OE
  17598.     "\u02C6":"{\\textasciicircum}", // MODIFIER LETTER CIRCUMFLEX ACCENT
  17599.     "\u02DC":"\\~{}", // SMALL TILDE
  17600.     "\u02DD":"{\\textacutedbl}", // DOUBLE ACUTE ACCENT
  17601.     "\u2001":"  ", // EM QUAD
  17602.     "\u2013":"{\\textendash}", // EN DASH
  17603.     "\u2014":"{\\textemdash}", // EM DASH
  17604.     "\u2015":"--", // HORIZONTAL BAR
  17605.     "\u2016":"{\\textbardbl}", // DOUBLE VERTICAL LINE
  17606.     "\u2017":"{\\textunderscore}", // DOUBLE LOW LINE
  17607.     "\u2018":"{\\textquoteleft}", // LEFT SINGLE QUOTATION MARK
  17608.     "\u2019":"{\\textquoteright}", // RIGHT SINGLE QUOTATION MARK
  17609.     "\u201A":"{\\quotesinglbase}", // SINGLE LOW-9 QUOTATION MARK
  17610.     "\u201C":"{\\textquotedblleft}", // LEFT DOUBLE QUOTATION MARK
  17611.     "\u201D":"{\\textquotedblright}", // RIGHT DOUBLE QUOTATION MARK
  17612.     "\u201E":"{\\quotedblbase}", // DOUBLE LOW-9 QUOTATION MARK
  17613.     "\u201F":"{\\quotedblbase}", // DOUBLE HIGH-REVERSED-9 QUOTATION MARK
  17614.     "\u2020":"{\\textdagger}", // DAGGER
  17615.     "\u2021":"{\\textdaggerdbl}", // DOUBLE DAGGER
  17616.     "\u2022":"{\\textbullet}", // BULLET
  17617.     "\u2026":"{\\textellipsis}", // HORIZONTAL ELLIPSIS
  17618.     "\u2030":"{\\textperthousand}", // PER MILLE SIGN
  17619.     "\u2034":"''''''", // TRIPLE PRIME
  17620.     "\u2036":"``", // REVERSED DOUBLE PRIME
  17621.     "\u2037":"```", // REVERSED TRIPLE PRIME
  17622.     "\u2039":"{\\guilsinglleft}", // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
  17623.     "\u203A":"{\\guilsinglright}", // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
  17624.     "\u203C":"!!", // DOUBLE EXCLAMATION MARK
  17625.     "\u2044":"{\\textfractionsolidus}", // FRACTION SLASH
  17626.     "\u2048":"?!", // QUESTION EXCLAMATION MARK
  17627.     "\u2049":"!?", // EXCLAMATION QUESTION MARK
  17628.     "\u2070":"$^{0}$", // SUPERSCRIPT ZERO
  17629.     "\u2074":"$^{4}$", // SUPERSCRIPT FOUR
  17630.     "\u2075":"$^{5}$", // SUPERSCRIPT FIVE
  17631.     "\u2076":"$^{6}$", // SUPERSCRIPT SIX
  17632.     "\u2077":"$^{7}$", // SUPERSCRIPT SEVEN
  17633.     "\u2078":"$^{8}$", // SUPERSCRIPT EIGHT
  17634.     "\u2079":"$^{9}$", // SUPERSCRIPT NINE
  17635.     "\u207A":"$^{+}$", // SUPERSCRIPT PLUS SIGN
  17636.     "\u207B":"$^{-}$", // SUPERSCRIPT MINUS
  17637.     "\u207C":"$^{=}$", // SUPERSCRIPT EQUALS SIGN
  17638.     "\u207D":"$^{(}$", // SUPERSCRIPT LEFT PARENTHESIS
  17639.     "\u207E":"$^{)}$", // SUPERSCRIPT RIGHT PARENTHESIS
  17640.     "\u207F":"$^{n}$", // SUPERSCRIPT LATIN SMALL LETTER N
  17641.     "\u2080":"$_{0}$", // SUBSCRIPT ZERO
  17642.     "\u2081":"$_{1}$", // SUBSCRIPT ONE
  17643.     "\u2082":"$_{2}$", // SUBSCRIPT TWO
  17644.     "\u2083":"$_{3}$", // SUBSCRIPT THREE
  17645.     "\u2084":"$_{4}$", // SUBSCRIPT FOUR
  17646.     "\u2085":"$_{5}$", // SUBSCRIPT FIVE
  17647.     "\u2086":"$_{6}$", // SUBSCRIPT SIX
  17648.     "\u2087":"$_{7}$", // SUBSCRIPT SEVEN
  17649.     "\u2088":"$_{8}$", // SUBSCRIPT EIGHT
  17650.     "\u2089":"$_{9}$", // SUBSCRIPT NINE
  17651.     "\u208A":"$_{+}$", // SUBSCRIPT PLUS SIGN
  17652.     "\u208B":"$_{-}$", // SUBSCRIPT MINUS
  17653.     "\u208C":"$_{=}$", // SUBSCRIPT EQUALS SIGN
  17654.     "\u208D":"$_{(}$", // SUBSCRIPT LEFT PARENTHESIS
  17655.     "\u208E":"$_{)}$", // SUBSCRIPT RIGHT PARENTHESIS
  17656.     "\u20AC":"{\\texteuro}", // EURO SIGN
  17657.     "\u2100":"a/c", // ACCOUNT OF
  17658.     "\u2101":"a/s", // ADDRESSED TO THE SUBJECT
  17659.     "\u2103":"{\\textcelsius}", // DEGREE CELSIUS
  17660.     "\u2105":"c/o", // CARE OF
  17661.     "\u2106":"c/u", // CADA UNA
  17662.     "\u2116":"{\\textnumero}", // NUMERO SIGN
  17663.     "\u2117":"{\\textcircledP}", // SOUND RECORDING COPYRIGHT
  17664.     "\u2120":"{\\textservicemark}", // SERVICE MARK
  17665.     "\u2121":"{TEL}", // TELEPHONE SIGN
  17666.     "\u2122":"{\\texttrademark}", // TRADE MARK SIGN
  17667.     "\u2126":"{\\textohm}", // OHM SIGN
  17668.     "\u212E":"{\\textestimated}", // ESTIMATED SYMBOL
  17669.     "\u2153":" 1/3", // VULGAR FRACTION ONE THIRD
  17670.     "\u2154":" 2/3", // VULGAR FRACTION TWO THIRDS
  17671.     "\u2155":" 1/5", // VULGAR FRACTION ONE FIFTH
  17672.     "\u2156":" 2/5", // VULGAR FRACTION TWO FIFTHS
  17673.     "\u2157":" 3/5", // VULGAR FRACTION THREE FIFTHS
  17674.     "\u2158":" 4/5", // VULGAR FRACTION FOUR FIFTHS
  17675.     "\u2159":" 1/6", // VULGAR FRACTION ONE SIXTH
  17676.     "\u215A":" 5/6", // VULGAR FRACTION FIVE SIXTHS
  17677.     "\u215B":" 1/8", // VULGAR FRACTION ONE EIGHTH
  17678.     "\u215C":" 3/8", // VULGAR FRACTION THREE EIGHTHS
  17679.     "\u215D":" 5/8", // VULGAR FRACTION FIVE EIGHTHS
  17680.     "\u215E":" 7/8", // VULGAR FRACTION SEVEN EIGHTHS
  17681.     "\u215F":" 1/", // FRACTION NUMERATOR ONE
  17682.     "\u2190":"{\\textleftarrow}", // LEFTWARDS ARROW
  17683.     "\u2191":"{\\textuparrow}", // UPWARDS ARROW
  17684.     "\u2192":"{\\textrightarrow}", // RIGHTWARDS ARROW
  17685.     "\u2193":"{\\textdownarrow}", // DOWNWARDS ARROW
  17686.     "\u2194":"<->", // LEFT RIGHT ARROW
  17687.     "\u21D0":"<=", // LEFTWARDS DOUBLE ARROW
  17688.     "\u21D2":"=>", // RIGHTWARDS DOUBLE ARROW
  17689.     "\u21D4":"<=>", // LEFT RIGHT DOUBLE ARROW
  17690.     "\u221E":"$\\infty$", // INFINITY
  17691.     "\u2225":"||", // PARALLEL TO
  17692.     "\u223C":"\\~{}", // TILDE OPERATOR
  17693.     "\u2260":"/=", // NOT EQUAL TO
  17694.     "\u2264":"<=", // LESS-THAN OR EQUAL TO
  17695.     "\u2265":">=", // GREATER-THAN OR EQUAL TO
  17696.     "\u226A":"<<", // MUCH LESS-THAN
  17697.     "\u226B":">>", // MUCH GREATER-THAN
  17698.     "\u2295":"(+)", // CIRCLED PLUS
  17699.     "\u2296":"(-)", // CIRCLED MINUS
  17700.     "\u2297":"(x)", // CIRCLED TIMES
  17701.     "\u2298":"(/)", // CIRCLED DIVISION SLASH
  17702.     "\u22A2":"|-", // RIGHT TACK
  17703.     "\u22A3":"-|", // LEFT TACK
  17704.     "\u22A6":"|-", // ASSERTION
  17705.     "\u22A7":"|=", // MODELS
  17706.     "\u22A8":"|=", // TRUE
  17707.     "\u22A9":"||-", // FORCES
  17708.     "\u22D5":"$\\#$", // EQUAL AND PARALLEL TO
  17709.     "\u22D8":"<<<", // VERY MUCH LESS-THAN
  17710.     "\u22D9":">>>", // VERY MUCH GREATER-THAN
  17711.     "\u22EF":"...", // MIDLINE HORIZONTAL ELLIPSIS
  17712.     "\u2329":"{\\textlangle}", // LEFT-POINTING ANGLE BRACKET
  17713.     "\u232A":"{\\textrangle}", // RIGHT-POINTING ANGLE BRACKET
  17714.     "\u2423":"{\\textvisiblespace}", // OPEN BOX
  17715.     "\u2425":"///", // SYMBOL FOR DELETE FORM TWO
  17716.     "\u25E6":"{\\textopenbullet}", // WHITE BULLET
  17717.     "\u2639":":-(", // WHITE FROWNING FACE
  17718.     "\u263A":":-)", // WHITE SMILING FACE
  17719.     "\u263B":"(-:", // BLACK SMILING FACE
  17720.     "\u266F":"$\\#$", // MUSIC SHARP SIGN
  17721.     "\u2701":"$\\%<$", // UPPER BLADE SCISSORS
  17722.     "\u2702":"$\\%<$", // BLACK SCISSORS
  17723.     "\u2703":"$\\%<$", // LOWER BLADE SCISSORS
  17724.     "\u2704":"$\\%<$", // WHITE SCISSORS
  17725.     "\uFB00":"ff", // LATIN SMALL LIGATURE FF
  17726.     "\uFB01":"fi", // LATIN SMALL LIGATURE FI
  17727.     "\uFB02":"fl", // LATIN SMALL LIGATURE FL
  17728.     "\uFB03":"ffi", // LATIN SMALL LIGATURE FFI
  17729.     "\uFB04":"ffl", // LATIN SMALL LIGATURE FFL
  17730. /* Derived accented characters */
  17731.     "\u00C0":"\\`{A}", // LATIN CAPITAL LETTER A WITH GRAVE
  17732.     "\u00C1":"\\''{A}", // LATIN CAPITAL LETTER A WITH ACUTE
  17733.     "\u00C2":"\\^{A}", // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
  17734.     "\u00C3":"\\~{A}", // LATIN CAPITAL LETTER A WITH TILDE
  17735.     "\u00C4":"\\~{A}", // LATIN CAPITAL LETTER A WITH DIAERESIS
  17736.     "\u00C7":"\\c{C}", // LATIN CAPITAL LETTER C WITH CEDILLA
  17737.     "\u00C8":"\\`{E}", // LATIN CAPITAL LETTER E WITH GRAVE
  17738.     "\u00C9":"\\''{E}", // LATIN CAPITAL LETTER E WITH ACUTE
  17739.     "\u00CA":"\\^{E}", // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
  17740.     "\u00CB":"\\~{E}", // LATIN CAPITAL LETTER E WITH DIAERESIS
  17741.     "\u00CC":"\\`{I}", // LATIN CAPITAL LETTER I WITH GRAVE
  17742.     "\u00CD":"\\''{I}", // LATIN CAPITAL LETTER I WITH ACUTE
  17743.     "\u00CE":"\\^{I}", // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
  17744.     "\u00CF":"\\~{I}", // LATIN CAPITAL LETTER I WITH DIAERESIS
  17745.     "\u00D1":"\\~{N}", // LATIN CAPITAL LETTER N WITH TILDE
  17746.     "\u00D2":"\\`{O}", // LATIN CAPITAL LETTER O WITH GRAVE
  17747.     "\u00D3":"\\''{O}", // LATIN CAPITAL LETTER O WITH ACUTE
  17748.     "\u00D4":"\\^{O}", // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
  17749.     "\u00D5":"\\~{O}", // LATIN CAPITAL LETTER O WITH TILDE
  17750.     "\u00D6":"\\~{O}", // LATIN CAPITAL LETTER O WITH DIAERESIS
  17751.     "\u00D9":"\\`{U}", // LATIN CAPITAL LETTER U WITH GRAVE
  17752.     "\u00DA":"\\''{U}", // LATIN CAPITAL LETTER U WITH ACUTE
  17753.     "\u00DB":"\\^{U}", // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
  17754.     "\u00DC":"\\~{U}", // LATIN CAPITAL LETTER U WITH DIAERESIS
  17755.     "\u00DD":"\\''{Y}", // LATIN CAPITAL LETTER Y WITH ACUTE
  17756.     "\u00E0":"\\`{a}", // LATIN SMALL LETTER A WITH GRAVE
  17757.     "\u00E1":"\\''{a}", // LATIN SMALL LETTER A WITH ACUTE
  17758.     "\u00E2":"\\^{a}", // LATIN SMALL LETTER A WITH CIRCUMFLEX
  17759.     "\u00E3":"\\~{a}", // LATIN SMALL LETTER A WITH TILDE
  17760.     "\u00E4":"\\~{a}", // LATIN SMALL LETTER A WITH DIAERESIS
  17761.     "\u00E7":"\\c{c}", // LATIN SMALL LETTER C WITH CEDILLA
  17762.     "\u00E8":"\\`{e}", // LATIN SMALL LETTER E WITH GRAVE
  17763.     "\u00E9":"\\''{e}", // LATIN SMALL LETTER E WITH ACUTE
  17764.     "\u00EA":"\\^{e}", // LATIN SMALL LETTER E WITH CIRCUMFLEX
  17765.     "\u00EB":"\\~{e}", // LATIN SMALL LETTER E WITH DIAERESIS
  17766.     "\u00EC":"\\`{i}", // LATIN SMALL LETTER I WITH GRAVE
  17767.     "\u00ED":"\\''{i}", // LATIN SMALL LETTER I WITH ACUTE
  17768.     "\u00EE":"\\^{i}", // LATIN SMALL LETTER I WITH CIRCUMFLEX
  17769.     "\u00EF":"\\~{i}", // LATIN SMALL LETTER I WITH DIAERESIS
  17770.     "\u00F1":"\\~{n}", // LATIN SMALL LETTER N WITH TILDE
  17771.     "\u00F2":"\\`{o}", // LATIN SMALL LETTER O WITH GRAVE
  17772.     "\u00F3":"\\''{o}", // LATIN SMALL LETTER O WITH ACUTE
  17773.     "\u00F4":"\\^{o}", // LATIN SMALL LETTER O WITH CIRCUMFLEX
  17774.     "\u00F5":"\\~{o}", // LATIN SMALL LETTER O WITH TILDE
  17775.     "\u00F6":"\\~{o}", // LATIN SMALL LETTER O WITH DIAERESIS
  17776.     "\u00F9":"\\`{u}", // LATIN SMALL LETTER U WITH GRAVE
  17777.     "\u00FA":"\\''{u}", // LATIN SMALL LETTER U WITH ACUTE
  17778.     "\u00FB":"\\^{u}", // LATIN SMALL LETTER U WITH CIRCUMFLEX
  17779.     "\u00FC":"\\~{u}", // LATIN SMALL LETTER U WITH DIAERESIS
  17780.     "\u00FD":"\\''{y}", // LATIN SMALL LETTER Y WITH ACUTE
  17781.     "\u00FF":"\\~{y}", // LATIN SMALL LETTER Y WITH DIAERESIS
  17782.     "\u0100":"\\={A}", // LATIN CAPITAL LETTER A WITH MACRON
  17783.     "\u0101":"\\={a}", // LATIN SMALL LETTER A WITH MACRON
  17784.     "\u0102":"\\u{A}", // LATIN CAPITAL LETTER A WITH BREVE
  17785.     "\u0103":"\\u{a}", // LATIN SMALL LETTER A WITH BREVE
  17786.     "\u0104":"\\k{A}", // LATIN CAPITAL LETTER A WITH OGONEK
  17787.     "\u0105":"\\k{a}", // LATIN SMALL LETTER A WITH OGONEK
  17788.     "\u0106":"\\''{C}", // LATIN CAPITAL LETTER C WITH ACUTE
  17789.     "\u0107":"\\''{c}", // LATIN SMALL LETTER C WITH ACUTE
  17790.     "\u0108":"\\^{C}", // LATIN CAPITAL LETTER C WITH CIRCUMFLEX
  17791.     "\u0109":"\\^{c}", // LATIN SMALL LETTER C WITH CIRCUMFLEX
  17792.     "\u010A":"\\.{C}", // LATIN CAPITAL LETTER C WITH DOT ABOVE
  17793.     "\u010B":"\\.{c}", // LATIN SMALL LETTER C WITH DOT ABOVE
  17794.     "\u010C":"\\v{C}", // LATIN CAPITAL LETTER C WITH CARON
  17795.     "\u010D":"\\v{c}", // LATIN SMALL LETTER C WITH CARON
  17796.     "\u010E":"\\v{D}", // LATIN CAPITAL LETTER D WITH CARON
  17797.     "\u010F":"\\v{d}", // LATIN SMALL LETTER D WITH CARON
  17798.     "\u0112":"\\={E}", // LATIN CAPITAL LETTER E WITH MACRON
  17799.     "\u0113":"\\={e}", // LATIN SMALL LETTER E WITH MACRON
  17800.     "\u0114":"\\u{E}", // LATIN CAPITAL LETTER E WITH BREVE
  17801.     "\u0115":"\\u{e}", // LATIN SMALL LETTER E WITH BREVE
  17802.     "\u0116":"\\.{E}", // LATIN CAPITAL LETTER E WITH DOT ABOVE
  17803.     "\u0117":"\\.{e}", // LATIN SMALL LETTER E WITH DOT ABOVE
  17804.     "\u0118":"\\k{E}", // LATIN CAPITAL LETTER E WITH OGONEK
  17805.     "\u0119":"\\k{e}", // LATIN SMALL LETTER E WITH OGONEK
  17806.     "\u011A":"\\v{E}", // LATIN CAPITAL LETTER E WITH CARON
  17807.     "\u011B":"\\v{e}", // LATIN SMALL LETTER E WITH CARON
  17808.     "\u011C":"\\^{G}", // LATIN CAPITAL LETTER G WITH CIRCUMFLEX
  17809.     "\u011D":"\\^{g}", // LATIN SMALL LETTER G WITH CIRCUMFLEX
  17810.     "\u011E":"\\u{G}", // LATIN CAPITAL LETTER G WITH BREVE
  17811.     "\u011F":"\\u{g}", // LATIN SMALL LETTER G WITH BREVE
  17812.     "\u0120":"\\.{G}", // LATIN CAPITAL LETTER G WITH DOT ABOVE
  17813.     "\u0121":"\\.{g}", // LATIN SMALL LETTER G WITH DOT ABOVE
  17814.     "\u0122":"\\c{G}", // LATIN CAPITAL LETTER G WITH CEDILLA
  17815.     "\u0123":"\\c{g}", // LATIN SMALL LETTER G WITH CEDILLA
  17816.     "\u0124":"\\^{H}", // LATIN CAPITAL LETTER H WITH CIRCUMFLEX
  17817.     "\u0125":"\\^{h}", // LATIN SMALL LETTER H WITH CIRCUMFLEX
  17818.     "\u0128":"\\~{I}", // LATIN CAPITAL LETTER I WITH TILDE
  17819.     "\u0129":"\\~{i}", // LATIN SMALL LETTER I WITH TILDE
  17820.     "\u012A":"\\={I}", // LATIN CAPITAL LETTER I WITH MACRON
  17821.     "\u012B":"\\={i}", // LATIN SMALL LETTER I WITH MACRON
  17822.     "\u012C":"\\u{I}", // LATIN CAPITAL LETTER I WITH BREVE
  17823.     "\u012D":"\\u{i}", // LATIN SMALL LETTER I WITH BREVE
  17824.     "\u012E":"\\k{I}", // LATIN CAPITAL LETTER I WITH OGONEK
  17825.     "\u012F":"\\k{i}", // LATIN SMALL LETTER I WITH OGONEK
  17826.     "\u0130":"\\.{I}", // LATIN CAPITAL LETTER I WITH DOT ABOVE
  17827.     "\u0134":"\\^{J}", // LATIN CAPITAL LETTER J WITH CIRCUMFLEX
  17828.     "\u0135":"\\^{j}", // LATIN SMALL LETTER J WITH CIRCUMFLEX
  17829.     "\u0136":"\\c{K}", // LATIN CAPITAL LETTER K WITH CEDILLA
  17830.     "\u0137":"\\c{k}", // LATIN SMALL LETTER K WITH CEDILLA
  17831.     "\u0139":"\\''{L}", // LATIN CAPITAL LETTER L WITH ACUTE
  17832.     "\u013A":"\\''{l}", // LATIN SMALL LETTER L WITH ACUTE
  17833.     "\u013B":"\\c{L}", // LATIN CAPITAL LETTER L WITH CEDILLA
  17834.     "\u013C":"\\c{l}", // LATIN SMALL LETTER L WITH CEDILLA
  17835.     "\u013D":"\\v{L}", // LATIN CAPITAL LETTER L WITH CARON
  17836.     "\u013E":"\\v{l}", // LATIN SMALL LETTER L WITH CARON
  17837.     "\u0143":"\\''{N}", // LATIN CAPITAL LETTER N WITH ACUTE
  17838.     "\u0144":"\\''{n}", // LATIN SMALL LETTER N WITH ACUTE
  17839.     "\u0145":"\\c{N}", // LATIN CAPITAL LETTER N WITH CEDILLA
  17840.     "\u0146":"\\c{n}", // LATIN SMALL LETTER N WITH CEDILLA
  17841.     "\u0147":"\\v{N}", // LATIN CAPITAL LETTER N WITH CARON
  17842.     "\u0148":"\\v{n}", // LATIN SMALL LETTER N WITH CARON
  17843.     "\u014C":"\\={O}", // LATIN CAPITAL LETTER O WITH MACRON
  17844.     "\u014D":"\\={o}", // LATIN SMALL LETTER O WITH MACRON
  17845.     "\u014E":"\\u{O}", // LATIN CAPITAL LETTER O WITH BREVE
  17846.     "\u014F":"\\u{o}", // LATIN SMALL LETTER O WITH BREVE
  17847.     "\u0150":"\\H{O}", // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
  17848.     "\u0151":"\\H{o}", // LATIN SMALL LETTER O WITH DOUBLE ACUTE
  17849.     "\u0154":"\\''{R}", // LATIN CAPITAL LETTER R WITH ACUTE
  17850.     "\u0155":"\\''{r}", // LATIN SMALL LETTER R WITH ACUTE
  17851.     "\u0156":"\\c{R}", // LATIN CAPITAL LETTER R WITH CEDILLA
  17852.     "\u0157":"\\c{r}", // LATIN SMALL LETTER R WITH CEDILLA
  17853.     "\u0158":"\\v{R}", // LATIN CAPITAL LETTER R WITH CARON
  17854.     "\u0159":"\\v{r}", // LATIN SMALL LETTER R WITH CARON
  17855.     "\u015A":"\\''{S}", // LATIN CAPITAL LETTER S WITH ACUTE
  17856.     "\u015B":"\\''{s}", // LATIN SMALL LETTER S WITH ACUTE
  17857.     "\u015C":"\\^{S}", // LATIN CAPITAL LETTER S WITH CIRCUMFLEX
  17858.     "\u015D":"\\^{s}", // LATIN SMALL LETTER S WITH CIRCUMFLEX
  17859.     "\u015E":"\\c{S}", // LATIN CAPITAL LETTER S WITH CEDILLA
  17860.     "\u015F":"\\c{s}", // LATIN SMALL LETTER S WITH CEDILLA
  17861.     "\u0160":"\\v{S}", // LATIN CAPITAL LETTER S WITH CARON
  17862.     "\u0161":"\\v{s}", // LATIN SMALL LETTER S WITH CARON
  17863.     "\u0162":"\\c{T}", // LATIN CAPITAL LETTER T WITH CEDILLA
  17864.     "\u0163":"\\c{t}", // LATIN SMALL LETTER T WITH CEDILLA
  17865.     "\u0164":"\\v{T}", // LATIN CAPITAL LETTER T WITH CARON
  17866.     "\u0165":"\\v{t}", // LATIN SMALL LETTER T WITH CARON
  17867.     "\u0168":"\\~{U}", // LATIN CAPITAL LETTER U WITH TILDE
  17868.     "\u0169":"\\~{u}", // LATIN SMALL LETTER U WITH TILDE
  17869.     "\u016A":"\\={U}", // LATIN CAPITAL LETTER U WITH MACRON
  17870.     "\u016B":"\\={u}", // LATIN SMALL LETTER U WITH MACRON
  17871.     "\u016C":"\\u{U}", // LATIN CAPITAL LETTER U WITH BREVE
  17872.     "\u016D":"\\u{u}", // LATIN SMALL LETTER U WITH BREVE
  17873.     "\u0170":"\\H{U}", // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
  17874.     "\u0171":"\\H{u}", // LATIN SMALL LETTER U WITH DOUBLE ACUTE
  17875.     "\u0172":"\\k{U}", // LATIN CAPITAL LETTER U WITH OGONEK
  17876.     "\u0173":"\\k{u}", // LATIN SMALL LETTER U WITH OGONEK
  17877.     "\u0174":"\\^{W}", // LATIN CAPITAL LETTER W WITH CIRCUMFLEX
  17878.     "\u0175":"\\^{w}", // LATIN SMALL LETTER W WITH CIRCUMFLEX
  17879.     "\u0176":"\\^{Y}", // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
  17880.     "\u0177":"\\^{y}", // LATIN SMALL LETTER Y WITH CIRCUMFLEX
  17881.     "\u0178":"\\~{Y}", // LATIN CAPITAL LETTER Y WITH DIAERESIS
  17882.     "\u0179":"\\''{Z}", // LATIN CAPITAL LETTER Z WITH ACUTE
  17883.     "\u017A":"\\''{z}", // LATIN SMALL LETTER Z WITH ACUTE
  17884.     "\u017B":"\\.{Z}", // LATIN CAPITAL LETTER Z WITH DOT ABOVE
  17885.     "\u017C":"\\.{z}", // LATIN SMALL LETTER Z WITH DOT ABOVE
  17886.     "\u017D":"\\v{Z}", // LATIN CAPITAL LETTER Z WITH CARON
  17887.     "\u017E":"\\v{z}", // LATIN SMALL LETTER Z WITH CARON
  17888.     "\u01CD":"\\v{A}", // LATIN CAPITAL LETTER A WITH CARON
  17889.     "\u01CE":"\\v{a}", // LATIN SMALL LETTER A WITH CARON
  17890.     "\u01CF":"\\v{I}", // LATIN CAPITAL LETTER I WITH CARON
  17891.     "\u01D0":"\\v{i}", // LATIN SMALL LETTER I WITH CARON
  17892.     "\u01D1":"\\v{O}", // LATIN CAPITAL LETTER O WITH CARON
  17893.     "\u01D2":"\\v{o}", // LATIN SMALL LETTER O WITH CARON
  17894.     "\u01D3":"\\v{U}", // LATIN CAPITAL LETTER U WITH CARON
  17895.     "\u01D4":"\\v{u}", // LATIN SMALL LETTER U WITH CARON
  17896.     "\u01E6":"\\v{G}", // LATIN CAPITAL LETTER G WITH CARON
  17897.     "\u01E7":"\\v{g}", // LATIN SMALL LETTER G WITH CARON
  17898.     "\u01E8":"\\v{K}", // LATIN CAPITAL LETTER K WITH CARON
  17899.     "\u01E9":"\\v{k}", // LATIN SMALL LETTER K WITH CARON
  17900.     "\u01EA":"\\k{O}", // LATIN CAPITAL LETTER O WITH OGONEK
  17901.     "\u01EB":"\\k{o}", // LATIN SMALL LETTER O WITH OGONEK
  17902.     "\u01F0":"\\v{j}", // LATIN SMALL LETTER J WITH CARON
  17903.     "\u01F4":"\\''{G}", // LATIN CAPITAL LETTER G WITH ACUTE
  17904.     "\u01F5":"\\''{g}", // LATIN SMALL LETTER G WITH ACUTE
  17905.     "\u1E02":"\\.{B}", // LATIN CAPITAL LETTER B WITH DOT ABOVE
  17906.     "\u1E03":"\\.{b}", // LATIN SMALL LETTER B WITH DOT ABOVE
  17907.     "\u1E04":"\\d{B}", // LATIN CAPITAL LETTER B WITH DOT BELOW
  17908.     "\u1E05":"\\d{b}", // LATIN SMALL LETTER B WITH DOT BELOW
  17909.     "\u1E06":"\\b{B}", // LATIN CAPITAL LETTER B WITH LINE BELOW
  17910.     "\u1E07":"\\b{b}", // LATIN SMALL LETTER B WITH LINE BELOW
  17911.     "\u1E0A":"\\.{D}", // LATIN CAPITAL LETTER D WITH DOT ABOVE
  17912.     "\u1E0B":"\\.{d}", // LATIN SMALL LETTER D WITH DOT ABOVE
  17913.     "\u1E0C":"\\d{D}", // LATIN CAPITAL LETTER D WITH DOT BELOW
  17914.     "\u1E0D":"\\d{d}", // LATIN SMALL LETTER D WITH DOT BELOW
  17915.     "\u1E0E":"\\b{D}", // LATIN CAPITAL LETTER D WITH LINE BELOW
  17916.     "\u1E0F":"\\b{d}", // LATIN SMALL LETTER D WITH LINE BELOW
  17917.     "\u1E10":"\\c{D}", // LATIN CAPITAL LETTER D WITH CEDILLA
  17918.     "\u1E11":"\\c{d}", // LATIN SMALL LETTER D WITH CEDILLA
  17919.     "\u1E1E":"\\.{F}", // LATIN CAPITAL LETTER F WITH DOT ABOVE
  17920.     "\u1E1F":"\\.{f}", // LATIN SMALL LETTER F WITH DOT ABOVE
  17921.     "\u1E20":"\\={G}", // LATIN CAPITAL LETTER G WITH MACRON
  17922.     "\u1E21":"\\={g}", // LATIN SMALL LETTER G WITH MACRON
  17923.     "\u1E22":"\\.{H}", // LATIN CAPITAL LETTER H WITH DOT ABOVE
  17924.     "\u1E23":"\\.{h}", // LATIN SMALL LETTER H WITH DOT ABOVE
  17925.     "\u1E24":"\\d{H}", // LATIN CAPITAL LETTER H WITH DOT BELOW
  17926.     "\u1E25":"\\d{h}", // LATIN SMALL LETTER H WITH DOT BELOW
  17927.     "\u1E26":"\\~{H}", // LATIN CAPITAL LETTER H WITH DIAERESIS
  17928.     "\u1E27":"\\~{h}", // LATIN SMALL LETTER H WITH DIAERESIS
  17929.     "\u1E28":"\\c{H}", // LATIN CAPITAL LETTER H WITH CEDILLA
  17930.     "\u1E29":"\\c{h}", // LATIN SMALL LETTER H WITH CEDILLA
  17931.     "\u1E30":"\\''{K}", // LATIN CAPITAL LETTER K WITH ACUTE
  17932.     "\u1E31":"\\''{k}", // LATIN SMALL LETTER K WITH ACUTE
  17933.     "\u1E32":"\\d{K}", // LATIN CAPITAL LETTER K WITH DOT BELOW
  17934.     "\u1E33":"\\d{k}", // LATIN SMALL LETTER K WITH DOT BELOW
  17935.     "\u1E34":"\\b{K}", // LATIN CAPITAL LETTER K WITH LINE BELOW
  17936.     "\u1E35":"\\b{k}", // LATIN SMALL LETTER K WITH LINE BELOW
  17937.     "\u1E36":"\\d{L}", // LATIN CAPITAL LETTER L WITH DOT BELOW
  17938.     "\u1E37":"\\d{l}", // LATIN SMALL LETTER L WITH DOT BELOW
  17939.     "\u1E3A":"\\b{L}", // LATIN CAPITAL LETTER L WITH LINE BELOW
  17940.     "\u1E3B":"\\b{l}", // LATIN SMALL LETTER L WITH LINE BELOW
  17941.     "\u1E3E":"\\''{M}", // LATIN CAPITAL LETTER M WITH ACUTE
  17942.     "\u1E3F":"\\''{m}", // LATIN SMALL LETTER M WITH ACUTE
  17943.     "\u1E40":"\\.{M}", // LATIN CAPITAL LETTER M WITH DOT ABOVE
  17944.     "\u1E41":"\\.{m}", // LATIN SMALL LETTER M WITH DOT ABOVE
  17945.     "\u1E42":"\\d{M}", // LATIN CAPITAL LETTER M WITH DOT BELOW
  17946.     "\u1E43":"\\d{m}", // LATIN SMALL LETTER M WITH DOT BELOW
  17947.     "\u1E44":"\\.{N}", // LATIN CAPITAL LETTER N WITH DOT ABOVE
  17948.     "\u1E45":"\\.{n}", // LATIN SMALL LETTER N WITH DOT ABOVE
  17949.     "\u1E46":"\\d{N}", // LATIN CAPITAL LETTER N WITH DOT BELOW
  17950.     "\u1E47":"\\d{n}", // LATIN SMALL LETTER N WITH DOT BELOW
  17951.     "\u1E48":"\\b{N}", // LATIN CAPITAL LETTER N WITH LINE BELOW
  17952.     "\u1E49":"\\b{n}", // LATIN SMALL LETTER N WITH LINE BELOW
  17953.     "\u1E54":"\\''{P}", // LATIN CAPITAL LETTER P WITH ACUTE
  17954.     "\u1E55":"\\''{p}", // LATIN SMALL LETTER P WITH ACUTE
  17955.     "\u1E56":"\\.{P}", // LATIN CAPITAL LETTER P WITH DOT ABOVE
  17956.     "\u1E57":"\\.{p}", // LATIN SMALL LETTER P WITH DOT ABOVE
  17957.     "\u1E58":"\\.{R}", // LATIN CAPITAL LETTER R WITH DOT ABOVE
  17958.     "\u1E59":"\\.{r}", // LATIN SMALL LETTER R WITH DOT ABOVE
  17959.     "\u1E5A":"\\d{R}", // LATIN CAPITAL LETTER R WITH DOT BELOW
  17960.     "\u1E5B":"\\d{r}", // LATIN SMALL LETTER R WITH DOT BELOW
  17961.     "\u1E5E":"\\b{R}", // LATIN CAPITAL LETTER R WITH LINE BELOW
  17962.     "\u1E5F":"\\b{r}", // LATIN SMALL LETTER R WITH LINE BELOW
  17963.     "\u1E60":"\\.{S}", // LATIN CAPITAL LETTER S WITH DOT ABOVE
  17964.     "\u1E61":"\\.{s}", // LATIN SMALL LETTER S WITH DOT ABOVE
  17965.     "\u1E62":"\\d{S}", // LATIN CAPITAL LETTER S WITH DOT BELOW
  17966.     "\u1E63":"\\d{s}", // LATIN SMALL LETTER S WITH DOT BELOW
  17967.     "\u1E6A":"\\.{T}", // LATIN CAPITAL LETTER T WITH DOT ABOVE
  17968.     "\u1E6B":"\\.{t}", // LATIN SMALL LETTER T WITH DOT ABOVE
  17969.     "\u1E6C":"\\d{T}", // LATIN CAPITAL LETTER T WITH DOT BELOW
  17970.     "\u1E6D":"\\d{t}", // LATIN SMALL LETTER T WITH DOT BELOW
  17971.     "\u1E6E":"\\b{T}", // LATIN CAPITAL LETTER T WITH LINE BELOW
  17972.     "\u1E6F":"\\b{t}", // LATIN SMALL LETTER T WITH LINE BELOW
  17973.     "\u1E7C":"\\~{V}", // LATIN CAPITAL LETTER V WITH TILDE
  17974.     "\u1E7D":"\\~{v}", // LATIN SMALL LETTER V WITH TILDE
  17975.     "\u1E7E":"\\d{V}", // LATIN CAPITAL LETTER V WITH DOT BELOW
  17976.     "\u1E7F":"\\d{v}", // LATIN SMALL LETTER V WITH DOT BELOW
  17977.     "\u1E80":"\\`{W}", // LATIN CAPITAL LETTER W WITH GRAVE
  17978.     "\u1E81":"\\`{w}", // LATIN SMALL LETTER W WITH GRAVE
  17979.     "\u1E82":"\\''{W}", // LATIN CAPITAL LETTER W WITH ACUTE
  17980.     "\u1E83":"\\''{w}", // LATIN SMALL LETTER W WITH ACUTE
  17981.     "\u1E84":"\\~{W}", // LATIN CAPITAL LETTER W WITH DIAERESIS
  17982.     "\u1E85":"\\~{w}", // LATIN SMALL LETTER W WITH DIAERESIS
  17983.     "\u1E86":"\\.{W}", // LATIN CAPITAL LETTER W WITH DOT ABOVE
  17984.     "\u1E87":"\\.{w}", // LATIN SMALL LETTER W WITH DOT ABOVE
  17985.     "\u1E88":"\\d{W}", // LATIN CAPITAL LETTER W WITH DOT BELOW
  17986.     "\u1E89":"\\d{w}", // LATIN SMALL LETTER W WITH DOT BELOW
  17987.     "\u1E8A":"\\.{X}", // LATIN CAPITAL LETTER X WITH DOT ABOVE
  17988.     "\u1E8B":"\\.{x}", // LATIN SMALL LETTER X WITH DOT ABOVE
  17989.     "\u1E8C":"\\~{X}", // LATIN CAPITAL LETTER X WITH DIAERESIS
  17990.     "\u1E8D":"\\~{x}", // LATIN SMALL LETTER X WITH DIAERESIS
  17991.     "\u1E8E":"\\.{Y}", // LATIN CAPITAL LETTER Y WITH DOT ABOVE
  17992.     "\u1E8F":"\\.{y}", // LATIN SMALL LETTER Y WITH DOT ABOVE
  17993.     "\u1E90":"\\^{Z}", // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
  17994.     "\u1E91":"\\^{z}", // LATIN SMALL LETTER Z WITH CIRCUMFLEX
  17995.     "\u1E92":"\\d{Z}", // LATIN CAPITAL LETTER Z WITH DOT BELOW
  17996.     "\u1E93":"\\d{z}", // LATIN SMALL LETTER Z WITH DOT BELOW
  17997.     "\u1E94":"\\b{Z}", // LATIN CAPITAL LETTER Z WITH LINE BELOW
  17998.     "\u1E95":"\\b{z}", // LATIN SMALL LETTER Z WITH LINE BELOW
  17999.     "\u1E96":"\\b{h}", // LATIN SMALL LETTER H WITH LINE BELOW
  18000.     "\u1E97":"\\~{t}", // LATIN SMALL LETTER T WITH DIAERESIS
  18001.     "\u1EA0":"\\d{A}", // LATIN CAPITAL LETTER A WITH DOT BELOW
  18002.     "\u1EA1":"\\d{a}", // LATIN SMALL LETTER A WITH DOT BELOW
  18003.     "\u1EB8":"\\d{E}", // LATIN CAPITAL LETTER E WITH DOT BELOW
  18004.     "\u1EB9":"\\d{e}", // LATIN SMALL LETTER E WITH DOT BELOW
  18005.     "\u1EBC":"\\~{E}", // LATIN CAPITAL LETTER E WITH TILDE
  18006.     "\u1EBD":"\\~{e}", // LATIN SMALL LETTER E WITH TILDE
  18007.     "\u1ECA":"\\d{I}", // LATIN CAPITAL LETTER I WITH DOT BELOW
  18008.     "\u1ECB":"\\d{i}", // LATIN SMALL LETTER I WITH DOT BELOW
  18009.     "\u1ECC":"\\d{O}", // LATIN CAPITAL LETTER O WITH DOT BELOW
  18010.     "\u1ECD":"\\d{o}", // LATIN SMALL LETTER O WITH DOT BELOW
  18011.     "\u1EE4":"\\d{U}", // LATIN CAPITAL LETTER U WITH DOT BELOW
  18012.     "\u1EE5":"\\d{u}", // LATIN SMALL LETTER U WITH DOT BELOW
  18013.     "\u1EF2":"\\`{Y}", // LATIN CAPITAL LETTER Y WITH GRAVE
  18014.     "\u1EF3":"\\`{y}", // LATIN SMALL LETTER Y WITH GRAVE
  18015.     "\u1EF4":"\\d{Y}", // LATIN CAPITAL LETTER Y WITH DOT BELOW
  18016.     "\u1EF5":"\\d{y}", // LATIN SMALL LETTER Y WITH DOT BELOW
  18017.     "\u1EF8":"\\~{Y}", // LATIN CAPITAL LETTER Y WITH TILDE
  18018.     "\u1EF9":"\\~{y}", // LATIN SMALL LETTER Y WITH TILDE
  18019.     
  18020. };
  18021.  
  18022. var alwaysMap = {
  18023.     "|":"{\\textbar}",
  18024.     "<":"{\\textless}",
  18025.     ">":"{\\textgreater}",
  18026.     "~":"{\\textasciitilde}",
  18027.     "^":"{\\textasciicircum}",
  18028.     "\\":"{\\textbackslash}"
  18029. };
  18030.  
  18031. function processField(item, field, value) {
  18032.     if(fieldMap[field]) {
  18033.         item[fieldMap[field]] = value;
  18034.     } else if(inputFieldMap[field]) {
  18035.         item[inputFieldMap[field]] = value;
  18036.     } else if(field == "journal") {
  18037.         if(item.publicationTitle) {
  18038.             // we already had an fjournal
  18039.             item.journalAbbreviation = value
  18040.         } else {
  18041.             item.publicationTitle = value;
  18042.         }
  18043.     } else if(field == "fjournal") {
  18044.         if(item.publicationTitle) {
  18045.             // move publicationTitle to abbreviation
  18046.             item.journalAbbreviation = value;
  18047.         }
  18048.         item.publicationTitle = value;
  18049.     } else if(field == "author" || field == "editor") {
  18050.         // parse authors/editors
  18051.         var names = value.split(" and ");
  18052.         for each(var name in names) {
  18053.             item.creators.push(Zotero.Utilities.cleanAuthor(name, field,
  18054.                                               (name.indexOf(",") != -1)));
  18055.         }
  18056.     } else if(field == "institution" || field == "organization") {
  18057.         item.backupPublisher = value;
  18058.     } else if(field == "number"){ // fix for techreport
  18059.         if (item.itemType == "report") {
  18060.             item.reportNumber = value;
  18061.         } else {
  18062.             item.issue = value;
  18063.         }
  18064.     } else if(field == "month") {
  18065.         var monthIndex = months.indexOf(value.toLowerCase());
  18066.         if(monthIndex != -1) {
  18067.             value = Zotero.Utilities.formatDate({month:monthIndex});
  18068.         } else {
  18069.             value += " ";
  18070.         }
  18071.         
  18072.         if(item.date) {
  18073.             if(value.indexOf(item.date) != -1) {
  18074.                 // value contains year and more
  18075.                 item.date = value;
  18076.             } else {
  18077.                 item.date = value+item.date;
  18078.             }
  18079.         } else {
  18080.             item.date = value;
  18081.         }
  18082.     } else if(field == "year") {
  18083.         if(item.date) {
  18084.             if(item.date.indexOf(value) == -1) {
  18085.                 // date does not already contain year
  18086.                 item.date += value;
  18087.             }
  18088.         } else {
  18089.             item.date = value;
  18090.         }
  18091.     } else if(field == "pages") {
  18092.         item.pages = value.replace(/--/g, "-");
  18093.     } else if(field == "note" || field == "annote") {
  18094.         item.extra += "\n"+value;
  18095.     } else if(field == "howpublished") {
  18096.         item.extra += "\nPublished: "+value;
  18097.     } else if(field == "keywords") {
  18098.         if(value.indexOf(",") == -1) {
  18099.             // keywords/tags
  18100.             item.tags = value.split(" ");
  18101.         } else {
  18102.             item.tags = value.split(/, ?/g);
  18103.         }
  18104.     }
  18105. }
  18106.  
  18107. function getFieldValue() {
  18108.     // read whitespace
  18109.     var read = Zotero.read(1);
  18110.     while(" \n\r\t".indexOf(read) != -1) {
  18111.         read = Zotero.read(1);
  18112.     }
  18113.     
  18114.     var value = "";
  18115.     // now, we have the first character of the field
  18116.     if("0123456789".indexOf(read) != -1) {
  18117.         value += read;
  18118.         // character is a number
  18119.         while((read = Zotero.read(1)) && ("0123456789".indexOf(read) != -1)) {
  18120.             value += read;
  18121.         }
  18122.     } else if(read == "{") {
  18123.         // character is a brace
  18124.         var openBraces = 1;
  18125.         while(read = Zotero.read(1)) {
  18126.             if(read == "{" && value[value.length-1] != "\\") {
  18127.                 openBraces++;
  18128.                 value += "{";
  18129.             } else if(read == "}" && value[value.length-1] != "\\") {
  18130.                 openBraces--;
  18131.                 if(openBraces == 0) {
  18132.                     break;
  18133.                 } else {
  18134.                     value += "}";
  18135.                 }
  18136.             } else {
  18137.                 value += read;
  18138.             }
  18139.         }
  18140.     } else if(read == ''"'') {
  18141.         var openBraces = 0;
  18142.         while(read = Zotero.read(1)) {
  18143.             if(read == "{" && value[value.length-1] != "\\") {
  18144.                 openBraces++;
  18145.                 value += "{";
  18146.             } else if(read == "}" && value[value.length-1] != "\\") {
  18147.                 openBraces--;
  18148.                 value += "}";
  18149.             } else if(read == ''"'' && openBraces == 0) {
  18150.                 break;
  18151.             } else {
  18152.                 value += read;
  18153.             }
  18154.         }
  18155.     }
  18156.     
  18157.     if(value.length > 1) {
  18158.         // replace accented characters (yucky slow)
  18159.         for (var i in reversemappingTable) { // really really slow!
  18160.             var mapped = reversemappingTable[i];
  18161.             if (value.indexOf(mapped) != -1) {
  18162.                 Zotero.debug("Replace " + mapped + " in " + value + " with " + i);
  18163.                 value = value.replace(mapped, i, "g");
  18164.             }
  18165.             mapped = mapped.replace(/[{}]/, "");
  18166.             if (value.indexOf(mapped) != -1) {
  18167.                 Zotero.debug("Replace(2) " + mapped + " in " + value + " with " + i);
  18168.                 value = value.replace(mapped, i, "g");
  18169.             }
  18170.         }
  18171.         
  18172.         // kill braces
  18173.         value = value.replace(/([^\\])[{}]+/g, "$1");
  18174.         if(value[0] == "{") {
  18175.             value = value.substr(1);
  18176.         }
  18177.         
  18178.         // chop off backslashes
  18179.         value = value.replace(/([^\\])\\([#$%&~_^\\{}])/g, "$1$2");
  18180.         value = value.replace(/([^\\])\\([#$%&~_^\\{}])/g, "$1$2");
  18181.         if(value[0] == "\\" && "#$%&~_^\\{}".indexOf(value[1]) != -1) {
  18182.             value = value.substr(1);
  18183.         }
  18184.         if(value[value.length-1] == "\\" &&  "#$%&~_^\\{}".indexOf(value[value.length-2]) != -1) {
  18185.             value = value.substr(0, value.length-1);
  18186.         }
  18187.         value = value.replace(/\\\\/g, "\\");
  18188.         value = value.replace(/\s+/g, " ");
  18189.     }
  18190.     
  18191.     return value;
  18192. }
  18193.  
  18194. function beginRecord(type, closeChar) {
  18195.     type = Zotero.Utilities.cleanString(type.toLowerCase());
  18196.     if(inputTypeMap[type]) {
  18197.         var item = new Zotero.Item(inputTypeMap[type]);
  18198.     } else {
  18199.         for(var i in typeMap) {
  18200.             if(typeMap[i] == type) {
  18201.                 var item = new Zotero.Item(i);
  18202.                 break;
  18203.             }
  18204.         }
  18205.         if(!item) {
  18206.             Zotero.debug("discarded item from BibTeX; type was "+type);
  18207.         }
  18208.     }
  18209.     
  18210.     item.extra = "";
  18211.     
  18212.     var field = "";
  18213.     while(read = Zotero.read(1)) {
  18214.         if(read == "=") {                                // equals begin a field
  18215.             var value = getFieldValue();
  18216.             if(item) {
  18217.                 processField(item, field.toLowerCase(), value);
  18218.             }
  18219.             field = "";
  18220.         } else if(read == ",") {                        // commas reset
  18221.             field = "";
  18222.         } else if(read == closeChar) {
  18223.             if(item) {
  18224.                 if(item.extra) item.extra = item.extra.substr(1); // chop \n
  18225.                 item.complete();
  18226.             }
  18227.             return;
  18228.         } else if(" \n\r\t".indexOf(read) == -1) {        // skip whitespace
  18229.             field += read;
  18230.         }
  18231.     }
  18232. }
  18233.  
  18234. function doImport() {
  18235.     var read = "", text = "", recordCloseElement = false;
  18236.     var type = false;
  18237.     
  18238.     Zotero.setCharacterSet("UTF-8");
  18239.     
  18240.     while(read = Zotero.read(1)) {
  18241.         if(read == "@") {
  18242.             type = "";
  18243.         } else if(type !== false) {
  18244.             if(read == "{") {                // possible open character
  18245.                 beginRecord(type, "}");
  18246.                 type = false;
  18247.             } else if(read == "(") {        // possible open character
  18248.                 beginRecord(type, ")");
  18249.                 type = false;
  18250.             } else {
  18251.                 type += read;
  18252.             }
  18253.         }
  18254.     }
  18255. }
  18256.  
  18257. // some fields are, in fact, macros.  If that is the case then we should not put the
  18258. // data in the braces as it will cause the macros to not expand properly
  18259. function writeField(field, value, isMacro) {
  18260.     if(!value) return;
  18261.     value = value + ""; // convert integers to strings
  18262.     Zotero.write(",\n\t"+field+" = ");
  18263.     if(!isMacro) Zotero.write("{");
  18264.     // I hope these are all the escape characters!
  18265.     value = value.replace(/[|\<\>\~\^\\]/g, mapEscape).replace(/([\#\$\%\&\_])/g, "\\$1");
  18266.     if (!Zotero.getOption("UTF8")) {
  18267.         value = value.replace(/[\u0080-\uFFFF]/g, mapAccent);
  18268.     }
  18269.     Zotero.write(value);
  18270.     if(!isMacro) Zotero.write("}");
  18271. }
  18272.  
  18273. function mapEscape(character) {
  18274.     return alwaysMap[character];
  18275. }
  18276.  
  18277. function mapAccent(character) {
  18278.     return (mappingTable[character] ? mappingTable[character] : "?");
  18279. }
  18280.  
  18281. var numberRe = /^[0-9]+/;
  18282. function doExport() {
  18283.     if(Zotero.getOption("UTF8")) {
  18284.         Zotero.setCharacterSet("UTF-8");
  18285.     }
  18286.     else {
  18287.         Zotero.setCharacterSet("us-ascii");
  18288.     }
  18289.     
  18290.     //Zotero.write("% BibTeX export generated by Zotero "+Zotero.Utilities.getVersion());
  18291.     
  18292.     var first = true;
  18293.     var citekeys = new Object();
  18294.     var item;
  18295.     while(item = Zotero.nextItem()) {
  18296.         // determine type
  18297.         var type = typeMap[item.itemType];
  18298.         if(!type) type = "misc";
  18299.         
  18300.         // create a unique citation key
  18301.         var basekey = "";
  18302.         if(item.creators && item.creators[0] && item.creators[0].lastName) {
  18303.             basekey += "_" + item.creators[0].lastName.toLowerCase().replace(/ /g,"_").replace(/,/g,"");
  18304.         }
  18305.         
  18306.         // include the item title as part of the citation key
  18307.         if (item["title"]) {
  18308.             // this is a list of words that should not appear as part of the citation key
  18309.             var bannedTitleKeys = ["a", "an", "from", "does", "how", "it''s", "its", "on", "some", "the", "this", "why"];
  18310.             var titleElements = item["title"].toLowerCase().split(" ");
  18311.             for(var te in titleElements) {
  18312.                 if (bannedTitleKeys.indexOf(titleElements[te]) == -1) {
  18313.                     basekey += "_" + titleElements[te];
  18314.                     break;
  18315.                 }
  18316.             }
  18317.         }
  18318.  
  18319.         if(item.date) {
  18320.             var date = Zotero.Utilities.strToDate(item.date);
  18321.             if(date.year && numberRe.test(date.year)) {
  18322.                 basekey += "_" + date.year;
  18323.             }
  18324.         }
  18325.         
  18326.         // for now, remove any characters not explicitly known to be allowed;
  18327.         // we might want to allow UTF-8 citation keys in the future, depending
  18328.         // on implementation support.
  18329.         //
  18330.         // no matter what, we want to make sure we exclude
  18331.         // " # % '' ( ) , = { } ~ and backslash
  18332.         
  18333.         basekey = basekey.substr(1).replace(/[^a-z0-9\!\$\&\*\+\-\.\/\:\;\<\>\?\[\]\^\_\`\|]+/g,"");
  18334.         var citekey = basekey;
  18335.         var i = 0;
  18336.         while(citekeys[citekey]) {
  18337.             i++;
  18338.             citekey = basekey+"-"+i;
  18339.         }
  18340.         citekeys[citekey] = true;
  18341.         
  18342.         // write citation key
  18343.         Zotero.write((first ? "" : ",\n\n") + "@"+type+"{"+citekey);
  18344.         first = false;
  18345.         
  18346.         for(var field in fieldMap) {
  18347.             if(item[fieldMap[field]]) {
  18348.                 writeField(field, item[fieldMap[field]]);
  18349.             }
  18350.         }
  18351.         
  18352.         if(item.conferenceName) {
  18353.             writeField("booktitle", item.conferenceName);
  18354.         }
  18355.  
  18356.         if(item.publicationTitle) {
  18357.             if(item.itemType == "chapter") {
  18358.                 writeField("booktitle", item.publicationTitle);
  18359.             } else {
  18360.                 writeField("journal", item.publicationTitle);
  18361.             }
  18362.         }
  18363.         
  18364.         if(item.publisher) {
  18365.             if(item.itemType == "thesis") {
  18366.                 writeField("school", item.publisher);
  18367.             } else {
  18368.                 writeField("publisher", item.publisher);
  18369.             }
  18370.         }
  18371.         
  18372.         if(item.creators && item.creators.length) {
  18373.             // split creators into subcategories
  18374.             var author = "";
  18375.             var editor = "";
  18376.             for each(var creator in item.creators) {
  18377.                 var creatorString = creator.lastName;
  18378.  
  18379.                 if (creator.firstName) {
  18380.                     creatorString = creator.firstName + " " + creator.lastName;
  18381.                 }
  18382.  
  18383.                 if (creator.creatorType == "editor") {
  18384.                     editor += " and "+creatorString;
  18385.                 } else {
  18386.                     author += " and "+creatorString;
  18387.                 }
  18388.             }
  18389.             
  18390.             if(author) {
  18391.                 writeField("author", author.substr(5));
  18392.             }
  18393.             if(editor) {
  18394.                 writeField("editor", editor.substr(5));
  18395.             }
  18396.         }
  18397.         
  18398.         if(item.date) {
  18399.             // need to use non-localized abbreviation
  18400.             if(date.month) {
  18401.                 writeField("month", months[date.month], true);
  18402.             }
  18403.             if(date.year) {
  18404.                 writeField("year", date.year);
  18405.             }
  18406.         }
  18407.         
  18408.         if(item.extra) {
  18409.             writeField("note", item.extra);
  18410.         }
  18411.         
  18412.         if(item.tags && item.tags.length) {
  18413.             var tagString = "";
  18414.             for each(var tag in item.tags) {
  18415.                 tagString += ","+tag.tag;
  18416.             }
  18417.             writeField("keywords", tagString.substr(1));
  18418.         }
  18419.         if(item.pages) {
  18420.             writeField("pages", item.pages);
  18421.         }
  18422.         
  18423.         Zotero.write("\n}");
  18424.     }
  18425. }');
  18426.  
  18427.  
  18428. REPLACE INTO translators VALUES ('a6ee60df-1ddc-4aae-bb25-45e0537be973', '1.0.0b3.r1', '', '2007-03-28 19:15:00', 1, 100, 1, 'MARC', 'Simon Kornblith', 'marc',
  18429. 'function detectImport() {
  18430.     var marcRecordRegexp = /^[0-9]{5}[a-z ]{3}$/
  18431.     var read = Zotero.read(8);
  18432.     if(marcRecordRegexp.test(read)) {
  18433.         return true;
  18434.     }
  18435. }',
  18436. 'var fieldTerminator = "\x1E";
  18437. var recordTerminator = "\x1D";
  18438. var subfieldDelimiter = "\x1F";
  18439.  
  18440. /*
  18441.  * CLEANING FUNCTIONS
  18442.  */
  18443.  
  18444. // general purpose cleaning
  18445. function clean(value) {
  18446.     value = value.replace(/^[\s\.\,\/\:;]+/, '''');
  18447.     value = value.replace(/[\s\.\,\/\:;]+$/, '''');
  18448.     value = value.replace(/ +/g, '' '');
  18449.     
  18450.     var char1 = value[0];
  18451.     var char2 = value[value.length-1];
  18452.     if((char1 == "[" && char2 == "]") || (char1 == "(" && char2 == ")")) {
  18453.         // chop of extraneous characters
  18454.         return value.substr(1, value.length-2);
  18455.     }
  18456.     
  18457.     return value;
  18458. }
  18459.  
  18460. // number extraction
  18461. function pullNumber(text) {
  18462.     var pullRe = /[0-9]+/;
  18463.     var m = pullRe.exec(text);
  18464.     if(m) {
  18465.         return m[0];
  18466.     }
  18467. }
  18468.  
  18469. // ISBN extraction
  18470. function pullISBN(text) {
  18471.     var pullRe = /[0-9X\-]+/;
  18472.     var m = pullRe.exec(text);
  18473.     if(m) {
  18474.         return m[0];
  18475.     }
  18476. }
  18477.  
  18478. // corporate author extraction
  18479. function corpAuthor(author) {
  18480.     return {lastName:author, fieldMode:true};
  18481. }
  18482.  
  18483. // regular author extraction
  18484. function author(author, type, useComma) {
  18485.     return Zotero.Utilities.cleanAuthor(author, type, useComma);
  18486. }
  18487.  
  18488. /*
  18489.  * END CLEANING FUNCTIONS
  18490.  */
  18491.  
  18492. var record = function() {
  18493.     this.directory = new Object();
  18494.     this.leader = "";
  18495.     this.content = "";
  18496.     
  18497.     // defaults
  18498.     this.indicatorLength = 2;
  18499.     this.subfieldCodeLength = 2;
  18500. }
  18501.  
  18502. // import a binary MARC record into this record
  18503. record.prototype.importBinary = function(record) {
  18504.     // get directory and leader
  18505.     var directory = record.substr(0, record.indexOf(fieldTerminator));
  18506.     this.leader = directory.substr(0, 24);
  18507.     var directory = directory.substr(24);
  18508.     
  18509.     // get various data
  18510.     this.indicatorLength = parseInt(this.leader[10], 10);
  18511.     this.subfieldCodeLength = parseInt(this.leader[11], 10);
  18512.     var baseAddress = parseInt(this.leader.substr(12, 5), 10);
  18513.     
  18514.     // get record data
  18515.     var contentTmp = record.substr(baseAddress);
  18516.     
  18517.     // MARC wants one-byte characters, so when we have multi-byte UTF-8
  18518.     // sequences, add null characters so that the directory shows up right. we
  18519.     // can strip the nulls later.
  18520.     this.content = "";
  18521.     for(i=0; i<contentTmp.length; i++) {
  18522.         this.content += contentTmp[i];
  18523.         if(contentTmp.charCodeAt(i) > 0x00FFFF) {
  18524.             this.content += "\x00\x00\x00";
  18525.         } else if(contentTmp.charCodeAt(i) > 0x0007FF) {
  18526.             this.content += "\x00\x00";
  18527.         } else if(contentTmp.charCodeAt(i) > 0x00007F) {
  18528.             this.content += "\x00";
  18529.         }
  18530.     }
  18531.     
  18532.     // read directory
  18533.     for(var i=0; i<directory.length; i+=12) {
  18534.         var tag = parseInt(directory.substr(i, 3), 10);
  18535.         var fieldLength = parseInt(directory.substr(i+3, 4), 10);
  18536.         var fieldPosition = parseInt(directory.substr(i+7, 5), 10);
  18537.         
  18538.         if(!this.directory[tag]) {
  18539.             this.directory[tag] = new Array();
  18540.         }
  18541.         this.directory[tag].push([fieldPosition, fieldLength]);
  18542.     }
  18543. }
  18544.  
  18545. // add a field to this record
  18546. record.prototype.addField = function(field, indicator, value) {
  18547.     field = parseInt(field, 10);
  18548.     // make sure indicator is the right length
  18549.     if(indicator.length > this.indicatorLength) {
  18550.         indicator = indicator.substr(0, this.indicatorLength);
  18551.     } else if(indicator.length != this.indicatorLength) {
  18552.         indicator = Zotero.Utilities.lpad(indicator, " ", this.indicatorLength);
  18553.     }
  18554.     
  18555.     // add terminator
  18556.     value = indicator+value+fieldTerminator;
  18557.     
  18558.     // add field to directory
  18559.     if(!this.directory[field]) {
  18560.         this.directory[field] = new Array();
  18561.     }
  18562.     this.directory[field].push([this.content.length, value.length]);
  18563.     
  18564.     // add field to record
  18565.     this.content += value;
  18566. }
  18567.  
  18568. // get all fields with a certain field number
  18569. record.prototype.getField = function(field) {
  18570.     field = parseInt(field, 10);
  18571.     var fields = new Array();
  18572.     
  18573.     // make sure fields exist
  18574.     if(!this.directory[field]) {
  18575.         return fields;
  18576.     }
  18577.     
  18578.     // get fields
  18579.     for(var i in this.directory[field]) {
  18580.         var location = this.directory[field][i];
  18581.         
  18582.         // add to array, replacing null characters
  18583.         fields.push([this.content.substr(location[0], this.indicatorLength),
  18584.                      this.content.substr(location[0]+this.indicatorLength,
  18585.                        location[1]-this.indicatorLength-1).replace(/\x00/g, "")]);
  18586.     }
  18587.     
  18588.     return fields;
  18589. }
  18590.  
  18591. // get subfields from a field
  18592. record.prototype.getFieldSubfields = function(tag) { // returns a two-dimensional array of values
  18593.     var fields = this.getField(tag);
  18594.     var returnFields = new Array();
  18595.     
  18596.     for(var i in fields) {
  18597.         returnFields[i] = new Object();
  18598.         
  18599.         var subfields = fields[i][1].split(subfieldDelimiter);
  18600.         if (subfields.length == 1) {
  18601.             returnFields[i]["?"] = fields[i][1];
  18602.         } else {
  18603.             for(var j in subfields) {
  18604.                 if(subfields[j]) {
  18605.                     var subfieldIndex = subfields[j].substr(0, this.subfieldCodeLength-1);
  18606.                     if(!returnFields[i][subfieldIndex]) {
  18607.                         returnFields[i][subfieldIndex] = subfields[j].substr(this.subfieldCodeLength-1);
  18608.                     }
  18609.                 }
  18610.             }
  18611.         }
  18612.     }
  18613.     
  18614.     return returnFields;
  18615. }
  18616.  
  18617. // add field to DB
  18618. record.prototype._associateDBField = function(item, fieldNo, part, fieldName, execMe, arg1, arg2) {
  18619.     var field = this.getFieldSubfields(fieldNo);
  18620.     Zotero.debug(''MARC: found ''+field.length+'' matches for ''+fieldNo+part);
  18621.     if(field) {
  18622.         for(var i in field) {
  18623.             var value = false;
  18624.             for(var j=0; j<part.length; j++) {
  18625.                 var myPart = part[j];
  18626.                 if(field[i][myPart]) {
  18627.                     if(value) {
  18628.                         value += " "+field[i][myPart];
  18629.                     } else {
  18630.                         value = field[i][myPart];
  18631.                     }
  18632.                 }
  18633.             }
  18634.             if(value) {
  18635.                 value = clean(value);
  18636.                 
  18637.                 if(execMe) {
  18638.                     value = execMe(value, arg1, arg2);
  18639.                 }
  18640.                 
  18641.                 if(fieldName == "creator") {
  18642.                     item.creators.push(value);
  18643.                 } else {
  18644.                     item[fieldName] = value;
  18645.                     return;
  18646.                 }
  18647.             }
  18648.         }
  18649.     }
  18650. }
  18651.  
  18652. // add field to DB as tags
  18653. record.prototype._associateTags = function(item, fieldNo, part) {
  18654.     var field = this.getFieldSubfields(fieldNo);
  18655.     
  18656.     for(var i in field) {
  18657.         for(var j=0; j<part.length; j++) {
  18658.             var myPart = part[j];
  18659.             if(field[i][myPart]) {
  18660.                 item.tags.push(clean(field[i][myPart]));
  18661.             }
  18662.         }
  18663.     }
  18664. }
  18665.  
  18666. // this function loads a MARC record into our database
  18667. record.prototype.translate = function(item) {
  18668.     // get item type
  18669.     if(this.leader) {
  18670.         var marcType = this.leader[6];
  18671.         if(marcType == "g") {
  18672.             item.itemType = "film";
  18673.         } else if(marcType == "k" || marcType == "e" || marcType == "f") {
  18674.             item.itemType = "artwork";
  18675.         } else if(marcType == "t") {
  18676.             item.itemType = "manuscript";
  18677.         } else {
  18678.             item.itemType = "book";
  18679.         }
  18680.     } else {
  18681.         item.itemType = "book";
  18682.     }
  18683.     
  18684.     // Extract ISBNs
  18685.     this._associateDBField(item, "020", "a", "ISBN", pullISBN);
  18686.     // Extract ISSNs
  18687.     this._associateDBField(item, "022", "a", "ISSN", pullISBN);
  18688.     // Extract creators
  18689.     this._associateDBField(item, "100", "a", "creator", author, "author", true);
  18690.     this._associateDBField(item, "110", "a", "creator", corpAuthor, "author");
  18691.     this._associateDBField(item, "111", "a", "creator", corpAuthor, "author");
  18692.     this._associateDBField(item, "700", "a", "creator", author, "contributor", true);
  18693.     this._associateDBField(item, "710", "a", "creator", corpAuthor, "contributor");
  18694.     this._associateDBField(item, "711", "a", "creator", corpAuthor, "contributor");
  18695.     if(item.itemType == "book" && !item.creators.length) {
  18696.         // some LOC entries have no listed author, but have the author in the person subject field as the first entry
  18697.         var field = this.getFieldSubfields("600");
  18698.         if(field[0]) {
  18699.             item.creators.push(Zotero.Utilities.cleanAuthor(field[0]["a"], "author", true));    
  18700.         }
  18701.     }
  18702.     
  18703.     // Extract tags
  18704.     // personal
  18705.     this._associateTags(item, "600", "aqtxyz");
  18706.     // corporate
  18707.     this._associateTags(item, "611", "abtxyz");
  18708.     // meeting
  18709.     this._associateTags(item, "630", "acetxyz");
  18710.     // uniform title
  18711.     this._associateTags(item, "648", "atxyz");
  18712.     // chronological
  18713.     this._associateTags(item, "650", "axyz");
  18714.     // topical
  18715.     this._associateTags(item, "651", "abcxyz");
  18716.     // geographic
  18717.     this._associateTags(item, "653", "axyz");
  18718.     // uncontrolled
  18719.     this._associateTags(item, "653", "a");
  18720.     // faceted topical term (whatever that means)
  18721.     this._associateTags(item, "654", "abcyz");
  18722.     // genre/form
  18723.     this._associateTags(item, "655", "abcxyz");
  18724.     // occupation
  18725.     this._associateTags(item, "656", "axyz");
  18726.     // function
  18727.     this._associateTags(item, "657", "axyz");
  18728.     // curriculum objective
  18729.     this._associateTags(item, "658", "ab");
  18730.     // hierarchical geographic place name
  18731.     this._associateTags(item, "662", "abcdfgh");
  18732.     
  18733.     // Extract title
  18734.     this._associateDBField(item, "245", "ab", "title");
  18735.     // Extract edition
  18736.     this._associateDBField(item, "250", "a", "edition");
  18737.     // Extract place info
  18738.     this._associateDBField(item, "260", "a", "place");
  18739.     
  18740.     // Extract publisher/distributor
  18741.     if(item.itemType == "film") {
  18742.         this._associateDBField(item, "260", "b", "distributor");
  18743.     } else {
  18744.         this._associateDBField(item, "260", "b", "publisher");
  18745.     }
  18746.     
  18747.     // Extract year
  18748.     this._associateDBField(item, "260", "c", "date", pullNumber);
  18749.     // Extract pages
  18750.     this._associateDBField(item, "300", "a", "pages", pullNumber);
  18751.     // Extract series
  18752.     this._associateDBField(item, "440", "a", "series");
  18753.     // Extract call number
  18754.     this._associateDBField(item, "084", "ab", "callNumber");
  18755.     this._associateDBField(item, "082", "a", "callNumber");
  18756.     this._associateDBField(item, "080", "ab", "callNumber");
  18757.     this._associateDBField(item, "070", "ab", "callNumber");
  18758.     this._associateDBField(item, "060", "ab", "callNumber");
  18759.     this._associateDBField(item, "050", "ab", "callNumber");
  18760.     
  18761.     if(item.title) {
  18762.         item.title = Zotero.Utilities.capitalizeTitle(item.title);
  18763.     }
  18764. }
  18765.  
  18766. function doImport() {
  18767.     var text;
  18768.     var holdOver = "";    // part of the text held over from the last loop
  18769.     
  18770.     Zotero.setCharacterSet("utf-8");
  18771.     
  18772.     while(text = Zotero.read(4096)) {    // read in 4096 byte increments
  18773.         var records = text.split("\x1D");
  18774.         
  18775.         if(records.length > 1) {
  18776.             records[0] = holdOver + records[0];
  18777.             holdOver = records.pop(); // skip last record, since it''s not done
  18778.             
  18779.             for(var i in records) {
  18780.                 var newItem = new Zotero.Item();
  18781.                 
  18782.                 // create new record
  18783.                 var rec = new record();    
  18784.                 rec.importBinary(records[i]);
  18785.                 rec.translate(newItem);
  18786.                 
  18787.                 newItem.complete();
  18788.             }
  18789.         } else {
  18790.             holdOver += text;
  18791.         }
  18792.     }
  18793. }');
  18794.  
  18795. REPLACE INTO translators VALUES ('3f50aaac-7acc-4350-acd0-59cb77faf620', '1.0.0b4.r1', '', '2007-11-02 08:30:00', '1', '100', '2', 'Wikipedia Citation Templates', 'Simon Kornblith', '', '', 
  18796. 'var fieldMap = {
  18797.     edition:"edition",
  18798.     publisher:"publisher",
  18799.     doi:"DOI",
  18800.     isbn:"ISBN",
  18801.     issn:"ISSN",
  18802.     conference:"conferenceName",
  18803.     volume:"volume",
  18804.     issue:"issue",
  18805.     pages:"pages",
  18806.     number:"episodeNumber"
  18807. };
  18808.  
  18809. var typeMap = {
  18810.     book:"Cite book",
  18811.     bookSection:"Cite book",
  18812.     journalArticle:"Cite journal",
  18813.     magazineArticle:"Cite news",
  18814.     newspaperArticle:"Cite news",
  18815.     thesis:"Cite paper",
  18816.     letter:"Cite",
  18817.     manuscript:"Cite book",
  18818.     interview:"Cite interview",
  18819.     film:"Cite video",
  18820.     artwork:"Cite",
  18821.     webpage:"Cite web",
  18822.     report:"Cite conference",
  18823.     bill:"Cite",
  18824.     hearing:"Cite",
  18825.     patent:"Cite",
  18826.     statute:"Cite",
  18827.     email:"Cite email",
  18828.     map:"Cite",
  18829.     blogPost:"Cite web",
  18830.     instantMessage:"Cite",
  18831.     forumPost:"Cite web",
  18832.     audioRecording:"Cite",
  18833.     presentation:"Cite paper",
  18834.     videoRecording:"Cite video",
  18835.     tvBroadcast:"Cite episode",
  18836.     radioBroadcast:"Cite episode",
  18837.     podcast:"Cite podcast",
  18838.     computerProgram:"Cite",
  18839.     conferencePaper:"Cite conference",
  18840.     document:"Cite",
  18841.     encyclopediaArticle:"Cite encyclopedia",
  18842.     dictionaryEntry:"Cite encyclopedia"
  18843. };
  18844.  
  18845. function formatAuthors(authors, useTypes) {
  18846.     var text = "";
  18847.     for each(var author in authors) {
  18848.         text += ", "+author.firstName;
  18849.         if(author.firstName && author.lastName) text += " ";
  18850.         text += author.lastName;
  18851.         if(useTypes) text += " ("+Zotero.Utilities.getLocalizedCreatorType(author.creatorType)+")";
  18852.     }
  18853.     return text.substr(2);
  18854. }
  18855.  
  18856. function formatFirstAuthor(authors, useTypes) {    
  18857.     var firstCreator = authors.shift();
  18858.     var field = firstCreator.lastName;
  18859.     if(firstCreator.lastName && firstCreator.firstName) field += ", ";
  18860.     field += firstCreator.firstName;
  18861.     if(useTypes) field += " ("+Zotero.Utilities.getLocalizedCreatorType(firstCreator.creatorType)+")";
  18862.     return field;
  18863. }
  18864.  
  18865. function formatDate(date) {
  18866.     var date = date.substr(0, date.indexOf(" "));
  18867.     if(date.substr(4, 3) == "-00") {
  18868.         date = date.substr(0, 4);
  18869.     } else if(date.substr(7, 3) == "-00") {
  18870.         date = date.substr(0, 7);
  18871.     }
  18872.     return date;
  18873. }
  18874.  
  18875. function doExport() {
  18876.     var first = true;
  18877.     while(item = Zotero.nextItem()) {
  18878.         // determine type
  18879.         var type = typeMap[item.itemType];
  18880.         if(!type) type = "Cite";
  18881.         
  18882.         var properties = new Object();
  18883.         
  18884.         for(var wikiField in fieldMap) {
  18885.             var zoteroField = fieldMap[wikiField];
  18886.             if(item[zoteroField]) properties[wikiField] = item[zoteroField];
  18887.         }
  18888.         
  18889.         if(item.creators && item.creators.length) {
  18890.             if(type == "Cite episode") {
  18891.                 // now add additional creators
  18892.                 properties.credits = formatAuthors(item.creators, true);
  18893.             } else if(type == "Cite video") {
  18894.                 properties.people = "";
  18895.                 
  18896.                 // make first creator first, last
  18897.                 properties.people = formatFirstAuthor(item.creators, true);
  18898.                 // now add additional creators
  18899.                 if(item.creators.length) properties.people += ", "+formatAuthors(item.creators, true);
  18900.                 
  18901.                 // use type
  18902.                 if(item.type) {
  18903.                     properties.medium = item.type;
  18904.                 }
  18905.             } else if(type == "Cite email") {
  18906.                 // get rid of non-authors
  18907.                 for(var i in item.creators) {
  18908.                     if(item.creators[i].creatorType != "author") {
  18909.                         // drop contributors
  18910.                         item.creators.splice(i, 1);
  18911.                     }
  18912.                 }
  18913.                 
  18914.                 // make first authors first, last
  18915.                 properties.author = formatFirstAuthor(item.creators);
  18916.                 // add supplemental authors
  18917.                 if(item.creators.length) {
  18918.                     properties.author += ", "+formatAuthors(item.creators);
  18919.                 }
  18920.             } else if(type == "Cite interview") {
  18921.                 // check for an interviewer or translator
  18922.                 var interviewers = [];
  18923.                 var translators = [];
  18924.                 for(var i in item.creators) {
  18925.                     if(item.creators[i].creatorType == "translator") {
  18926.                         translators = translators.concat(item.creators.splice(i, 1));
  18927.                     } else if(item.creators[i].creatorType == "interviewer") {
  18928.                         interviewers = interviewers.concat(item.creators.splice(i, 1));
  18929.                     } else if(item.creators[i].creatorType == "contributor") {
  18930.                         // drop contributors
  18931.                         item.creators.splice(i, 1);
  18932.                     }
  18933.                 }
  18934.                 
  18935.                 // interviewers
  18936.                 if(interviewers.length) {
  18937.                     properties.interviewer = formatAuthors([interviewers.shift()]);
  18938.                     if(interviewers.length) properties.cointerviewers = formatAuthors(interviewers);
  18939.                 }
  18940.                 // translators
  18941.                 if(translators.length) {
  18942.                     properties.cointerviewers = (properties.cointerviewers ? properties.cointerviewers+", " : "");
  18943.                     properties.cointerviewers += formatAuthors(translators);
  18944.                 }
  18945.                 // interviewees
  18946.                 if(item.creators.length) {
  18947.                     // take up to 4 interviewees
  18948.                     var i = 1;
  18949.                     while((interviewee = item.creators.shift()) && i <= 4) {
  18950.                         var lastKey = "last";
  18951.                         var firstKey = "first";
  18952.                         if(i != 1) {
  18953.                             lastKey += i;
  18954.                             firstKey += i;
  18955.                         }
  18956.                         
  18957.                         properties[lastKey] = interviewee.lastName;
  18958.                         properties[firstKey] = interviewee.firstName;
  18959.                     }
  18960.                 }
  18961.                 // medium
  18962.                 if(item.medium) {
  18963.                     properties.type = item.medium
  18964.                 }
  18965.             } else {
  18966.                 // check for an editor or translator
  18967.                 var editors = [];
  18968.                 var translators = [];
  18969.                 for(var i in item.creators) {
  18970.                     if(item.creators[i].creatorType == "translator") {
  18971.                         translators = translators.concat(item.creators.splice(i, 1));
  18972.                     } else if(item.creators[i].creatorType == "editor") {
  18973.                         editors = editors.concat(item.creators.splice(i, 1));
  18974.                     } else if(item.creators[i].creatorType == "contributor") {
  18975.                         // drop contributors
  18976.                         item.creators.splice(i, 1);
  18977.                     }
  18978.                 }
  18979.                 
  18980.                 // editors
  18981.                 var others = "";
  18982.                 if(editors.length) {
  18983.                     var editorText = formatAuthors(editors)+(editors.length == 1 ? " (ed.)" : " (eds.)");
  18984.                     if(item.itemType == "bookSection" || type == "Cite conference" || type == "Cite encyclopedia") {
  18985.                         // as per docs, use editor only for chapters
  18986.                         properties.editors = editorText;
  18987.                     } else {
  18988.                         others = editorText;
  18989.                     }
  18990.                 }
  18991.                 // translators
  18992.                 if(translators.length) {
  18993.                     if(others) others += ", ";
  18994.                     others += formatAuthors(translators)+" (trans.)";
  18995.                 }
  18996.                 
  18997.                 // pop off first author, if there is one
  18998.                 if(item.creators.length) {
  18999.                     var firstAuthor = item.creators.shift();
  19000.                     properties.last = firstAuthor.lastName;
  19001.                     properties.first = firstAuthor.firstName;
  19002.                     
  19003.                     // add supplemental authors
  19004.                     if(item.creators.length) {
  19005.                         properties.coauthors = formatAuthors(item.creators);
  19006.                     }
  19007.                 }
  19008.                 
  19009.                 // attach others
  19010.                 if(others) {
  19011.                     if(type == "Cite book") {
  19012.                         properties.others = others;
  19013.                     } else {
  19014.                         properties.coauthors = (properties.coauthors ? properties.coauthors+", " : "");
  19015.                         properties.coauthors += others;
  19016.                     }
  19017.                 }
  19018.             }
  19019.         }
  19020.         
  19021.         if(item.itemType == "bookSection") {
  19022.             properties.title = item.publicationTitle;
  19023.             properties.chapter = item.title;;
  19024.         } else {
  19025.             properties.title = item.title;
  19026.             
  19027.             if(type == "Cite journal") {
  19028.                 properties.journal = item.publicationTitle;
  19029.             } else if(type == "Cite conference") {
  19030.                 properties.booktitle = item.publicationTitle;
  19031.             } else if(type == "Cite encyclopedia") {
  19032.                 properties.encyclopedia = item.publicationTitle;
  19033.             } else {
  19034.                 properties.work = item.publicationTitle;
  19035.             }
  19036.         }
  19037.         
  19038.         if(type == "Cite web" && item.type) {
  19039.             properties.format = item.type;
  19040.         }
  19041.         
  19042.         if(item.place) {
  19043.             if(type == "Cite episode") {
  19044.                 properties.city = item.place;
  19045.             } else {
  19046.                 properties.location = item.place;
  19047.             }
  19048.         }
  19049.         
  19050.         if(item.series) {
  19051.             properties.series = item.series;
  19052.         } else if(item.seriesTitle) {
  19053.             properties.series = item.seriesTitle;
  19054.         } else if(item.seriesText) {
  19055.             properties.series = item.seriesText;
  19056.         }
  19057.         
  19058.         if(item.accessDate) {
  19059.             properties.accessdate = formatDate(item.accessDate);
  19060.         }
  19061.         
  19062.         if(item.date) {
  19063.             if(type == "Cite email") {
  19064.                 properties.senddate = formatDate(item.date);
  19065.             } else {
  19066.                 var date = Zotero.Utilities.strToDate(item.date);
  19067.                 var mm = "00";
  19068.                 var dd = "00";
  19069.                 if (date["month"] != undefined){
  19070.                     mm = date["month"];
  19071.                     mm = mm + 1;
  19072.                     if (mm < 10){
  19073.                         mm = "0" + mm;
  19074.                     } 
  19075.                 }
  19076.                 if (date["day"] != undefined){
  19077.                     dd = date["day"];
  19078.                     if (dd < 10){
  19079.                         dd = "0" + dd;
  19080.                     } 
  19081.                 }
  19082.                 if (date["year"] != undefined){
  19083.                     var yyyy = date["year"].toString();
  19084.                     while (yyyy.length < 4){
  19085.                         yyyy = "0"+yyyy;
  19086.                     }
  19087.                     properties.date = formatDate(yyyy+"-"+mm+"-"+dd+" ");
  19088.                 }
  19089.             }
  19090.         }
  19091.         
  19092.         if(item.runningTime) {
  19093.             if(type == "Cite episode") {
  19094.                 properties.minutes = item.runningTime;
  19095.             } else {
  19096.                 properties.time = item.runningTime;
  19097.             }
  19098.         }
  19099.         
  19100.         if(item.url && item.accessDate) {
  19101.             if(item.itemType == "bookSection") {
  19102.                 properties.chapterurl = item.url;
  19103.             } else {
  19104.                 properties.url = item.url;
  19105.             }
  19106.         }
  19107.         
  19108.         // write out properties
  19109.         Zotero.write((first ? "" : "\r\n\r\n") + "{{"+type);
  19110.         for(var key in properties) {
  19111.             if(properties[key]) Zotero.write("\r\n| "+key+" = "+properties[key]);
  19112.         }
  19113.         Zotero.write("\r\n}}");
  19114.         
  19115.         first = false;
  19116.     }
  19117. }');
  19118.  
  19119.  
  19120.  
  19121.  
  19122. -- ----------------------------------------------------------------
  19123. --
  19124. --  CSL styles
  19125. --
  19126. -- ----------------------------------------------------------------
  19127. REPLACE INTO csl VALUES ('http://www.zotero.org/syles/ama', '2008-02-02 00:00:00', 'American Medical Association',
  19128. '<?xml version="1.0" encoding="UTF-8"?>
  19129. <style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" xml:lang="en">
  19130.   <info>
  19131.     <title>American Medical Association</title>
  19132.     <id>http://www.zotero.org/syles/ama</id>
  19133.     <link href="http://www.zotero.org/syles/ama"/>
  19134.     <author>
  19135.       <name>Julian Onions</name>
  19136.       <email>julian.onions@gmail.com</email>
  19137.     </author>
  19138.     <category term="numeric"/>
  19139.     <category term="medicine"/>
  19140.     <updated>2008-02-02T00:00:00+00:00</updated>
  19141.     <summary>The American Medical Association style as used in JAMA.</summary>
  19142.     <link href="http://www.samford.edu/schools/pharmacy/dic/amaquickref07.pdf" rel="documentation"/>
  19143.   </info>
  19144.   <macro name="editor">
  19145.     <names variable="editor">
  19146.       <name name-as-sort-order="all" sort-separator=" " initialize-with="" delimiter=", " delimiter-precedes-last="always"/>
  19147.       <label form="short" prefix=", " text-case="lowercase" suffix="."/>
  19148.     </names>
  19149.   </macro>
  19150.   <macro name="anon">
  19151.     <text term="anonymous" form="short" text-case="capitalize-first"/>
  19152.   </macro>
  19153.   <macro name="author">
  19154.     <group suffix=".">
  19155.       <names variable="author">
  19156.     <name name-as-sort-order="all" sort-separator=" " initialize-with=""
  19157.           delimiter=", " delimiter-precedes-last="always"/>
  19158.     <label form="short" prefix=" " suffix="" text-case="lowercase"/>
  19159.     <substitute>
  19160.       <names variable="editor"/>
  19161.       <text macro="anon"/>
  19162.     </substitute>
  19163.       </names>
  19164.     </group>
  19165.   </macro>
  19166.   <macro name="author-short">
  19167.     <names variable="author">
  19168.       <name form="short" and="symbol" delimiter=", " initialize-with="."/>
  19169.       <substitute>
  19170.     <names variable="editor"/>
  19171.     <names variable="translator"/>
  19172.     <text macro="anon"/>
  19173.       </substitute>
  19174.     </names>
  19175.   </macro>
  19176.   <macro name="access">
  19177.     <group>
  19178.       <text value="Available at:" suffix=" "/>
  19179.       <text variable="URL"/>
  19180.       <group prefix=" [" suffix="]">
  19181.     <text term="accessed" text-case="capitalize-first" suffix=" "/>
  19182.     <date variable="accessed">
  19183.       <date-part name="month" suffix=" "/>
  19184.       <date-part name="day" suffix=", "/>
  19185.       <date-part name="year"/>
  19186.     </date>
  19187.       </group>
  19188.     </group>
  19189.   </macro>
  19190.   <macro name="title">
  19191.     <choose>
  19192.       <if type="book">
  19193.     <text variable="title" font-style="italic"/>
  19194.       </if>
  19195.       <else>
  19196.     <text variable="title"/>
  19197.       </else>
  19198.     </choose>
  19199.   </macro>
  19200.   <macro name="publisher">
  19201.     <group delimiter=": ">
  19202.       <text variable="publisher-place"/>
  19203.       <text variable="publisher"/>
  19204.     </group>
  19205.   </macro>
  19206.   <macro name="year-date">
  19207.     <group prefix=" ">
  19208.       <choose>
  19209.     <if variable="issued">
  19210.       <date variable="issued">
  19211.         <date-part name="year"/>
  19212.       </date>
  19213.     </if>
  19214.     <else>
  19215.       <text term="no date"/>
  19216.     </else>
  19217.       </choose>
  19218.     </group>
  19219.   </macro>
  19220.   <macro name="edition">
  19221.     <choose>
  19222.       <if is-numeric="edition">
  19223.     <group delimiter=" ">
  19224.       <number variable="edition" form="ordinal"/>
  19225.       <text term="edition" form="short" suffix="."/>
  19226.     </group>
  19227.       </if>
  19228.       <else>
  19229.       <text variable="edition" suffix="."/>
  19230.       </else>
  19231.     </choose>
  19232.   </macro>
  19233.   <citation>
  19234.     <option name="collapse" value="citation-number"/>
  19235.     <sort>
  19236.       <key variable="citation-number"/>
  19237.     </sort>
  19238.     <layout delimiter="," vertical-align="sup">
  19239.       <text variable="citation-number" />
  19240.       <group prefix="(" suffix=")">
  19241.     <label variable="locator" form="short"/>
  19242.     <text variable="locator"/>
  19243.       </group>
  19244.     </layout>
  19245.   </citation>
  19246.   <bibliography>
  19247.     <option name="hanging-indent" value="false"/>
  19248.     <option name="et-al-min" value="6"/>
  19249.     <option name="et-al-use-first" value="3"/>
  19250.     <layout>
  19251.       <text variable="citation-number" prefix="" suffix=". "/>
  19252.       <text macro="author" suffix=""/>
  19253.       <choose>
  19254.     <if type="book">
  19255.       <group suffix=".">
  19256.         <text macro="title" prefix=" " suffix="."/>
  19257.         <text macro="edition" prefix=" " />
  19258.         <text macro="editor" prefix=" (" suffix=")"/>
  19259.       </group>
  19260.       <text prefix=" " suffix="" macro="publisher"/>
  19261.       <group suffix="." prefix="; ">
  19262.         <date variable="issued">
  19263.           <date-part name="year"/>
  19264.         </date>
  19265.         <text variable="page" prefix=":"/>
  19266.       </group>
  19267.     </if>
  19268.     <else-if type="chapter">
  19269.       <text macro="title" prefix=" " suffix="."/>
  19270.       <group class="container" prefix=" ">
  19271.         <text term="in" text-case="capitalize-first" suffix=": "/>
  19272.         <text macro="editor"/>
  19273.         <text variable="container-title" font-style="italic" prefix=" " suffix="."/>
  19274.         <text variable="volume" prefix="Vol " suffix="."/>
  19275.         <text macro="edition" prefix=" "/>
  19276.         <text variable="collection-title" prefix=" " suffix="."/>
  19277.         <group suffix=".">
  19278.           <text macro="publisher" prefix=" "/>
  19279.           <group suffix="." prefix="; ">
  19280.         <date variable="issued">
  19281.           <date-part name="year"/>
  19282.         </date>
  19283.         <text variable="page" prefix=":"/>
  19284.           </group>
  19285.         </group>
  19286.       </group>
  19287.     </else-if>
  19288.     <else>
  19289.       <group suffix=".">
  19290.         <text macro="title" prefix=" " />
  19291.         <text macro="editor" prefix=" "/>
  19292.       </group>
  19293.       <group class="container" prefix=" " suffix=".">
  19294.         <text variable="container-title" font-style="italic" form="short" suffix="."/>
  19295.         <group delimiter=";" prefix=" ">
  19296.           <date variable="issued">
  19297.         <date-part name="year"/>
  19298.           </date>
  19299.           <group>
  19300.         <text variable="volume" />
  19301.         <text variable="issue" prefix="(" suffix=")"/>
  19302.           </group>
  19303.         </group>
  19304.         <text variable="page" prefix=":"/>
  19305.       </group>
  19306.     </else>
  19307.       </choose>
  19308.       <text prefix=" " macro="access" suffix="."/>
  19309.     </layout>
  19310.   </bibliography>
  19311. </style>
  19312. ');
  19313.  
  19314. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/apa', '2008-02-02 00:00:00', 'American Psychological Association',
  19315. '<?xml version="1.0" encoding="UTF-8"?>
  19316. <?oxygen RNGSchema="http://xbiblio.svn.sourceforge.net/viewvc/*checkout*/xbiblio/csl/schema/trunk/csl.rnc" type="compact"?>
  19317. <style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" xml:lang="en">
  19318.   <info>
  19319.     <title>American Psychological Association</title>
  19320.     <id>http://www.zotero.org/styles/apa</id>
  19321.     <link href="http://www.zotero.org/styles/apa"/>
  19322.     <author>
  19323.       <name>Simon Kornblith</name>
  19324.       <email>simon@simonster.com</email>
  19325.     </author>
  19326.     <category term="psychology"/>
  19327.     <category term="generic-base"/>
  19328.     <category term="author-date"/>
  19329.     <updated>2008-02-02T00:00:00+00:00</updated>
  19330.   </info>
  19331.   <macro name="editor-translator">
  19332.     <names variable="editor translator" delimiter=", ">
  19333.       <name and="symbol" initialize-with=". " delimiter=", "/>
  19334.       <label form="short" prefix=" (" text-case="capitalize-first" suffix=".)"/>
  19335.     </names>
  19336.   </macro>
  19337.   <macro name="author">
  19338.     <names variable="author">
  19339.       <name name-as-sort-order="all" and="symbol" sort-separator=", "
  19340.         initialize-with=". " delimiter=", " delimiter-precedes-last="always"/>
  19341.       <label form="short" prefix=" (" suffix=".)" text-case="capitalize-first"/>
  19342.       <substitute>
  19343.         <names variable="editor"/>
  19344.         <names variable="translator"/>
  19345.         <text macro="title"/>
  19346.       </substitute>
  19347.     </names>
  19348.   </macro>
  19349.   <macro name="author-short">
  19350.     <names variable="author">
  19351.       <name form="short" and="symbol" delimiter=", " initialize-with=". "/>
  19352.       <substitute>
  19353.         <names variable="editor"/>
  19354.         <names variable="translator"/>
  19355.         <choose>
  19356.           <if type="book">
  19357.             <text variable="title" form="short" font-style="italic"/>
  19358.           </if>
  19359.           <else>
  19360.             <text variable="title" form="short" quotes="true"/>
  19361.           </else>
  19362.         </choose>
  19363.       </substitute>
  19364.     </names>
  19365.   </macro>
  19366.   <macro name="access">
  19367.     <choose>
  19368.       <if variable="DOI">
  19369.         <text variable="DOI" prefix="doi: "/>
  19370.       </if>
  19371.       <else>
  19372.         <group>
  19373.           <text term="retrieved" text-case="capitalize-first" suffix=" "/>
  19374.           <date variable="accessed" suffix=", ">
  19375.             <date-part name="month" suffix=" "/>
  19376.             <date-part name="day" suffix=", "/>
  19377.             <date-part name="year"/>
  19378.           </date>
  19379.           <group>
  19380.             <text term="from" suffix=" "/>
  19381.             <text variable="URL"/>
  19382.           </group>
  19383.         </group>
  19384.       </else>
  19385.     </choose>
  19386.   </macro>
  19387.   <macro name="title">
  19388.     <choose>
  19389.       <if type="book">
  19390.         <text variable="title" text-case="sentence" font-style="italic"/>
  19391.       </if>
  19392.       <else>
  19393.         <text variable="title" text-case="sentence"/>
  19394.       </else>
  19395.     </choose>
  19396.   </macro>
  19397.   <macro name="publisher">
  19398.     <group delimiter=": ">
  19399.       <text variable="publisher-place"/>
  19400.       <text variable="publisher"/>
  19401.     </group>
  19402.   </macro>
  19403.   <macro name="event">
  19404.     <text variable="event"/>
  19405.     <text variable="event-place" prefix=", "/>
  19406.   </macro>
  19407.   <macro name="issued">
  19408.     <group prefix=" (" suffix=").">
  19409.       <date variable="issued">
  19410.         <date-part name="year"/>
  19411.       </date>
  19412.       <choose>
  19413.         <if type="book chapter article-journal" match="none">
  19414.           <date variable="issued">
  19415.             <date-part prefix=", " name="month"/>
  19416.             <date-part prefix=" " name="day"/>
  19417.           </date>
  19418.         </if>
  19419.       </choose>
  19420.     </group>
  19421.   </macro>
  19422.   <macro name="issued-year">
  19423.     <date variable="issued">
  19424.       <date-part name="year"/>
  19425.     </date>
  19426.   </macro>
  19427.   <macro name="citation-locator">
  19428.     <group>
  19429.       <label variable="locator" include-period="true" form="short"/>
  19430.       <text variable="locator" prefix=" "/>
  19431.     </group>
  19432.   </macro>
  19433.   <macro name="container-prefix">
  19434.     <choose>
  19435.       <if type="chapter">
  19436.         <text term="in" text-case="capitalize-first" suffix=" "/>
  19437.       </if>
  19438.     </choose>
  19439.   </macro>
  19440.   <macro name="pages">
  19441.     <choose>
  19442.       <if type="chapter">
  19443.         <group prefix=" (" suffix=")">
  19444.           <label variable="page" form="short" include-period="true" suffix=" "/>
  19445.           <text variable="page"/>
  19446.         </group>
  19447.       </if>
  19448.       <else>
  19449.         <text variable="page" prefix=", "/>
  19450.       </else>
  19451.     </choose>
  19452.   </macro>
  19453.   <macro name="edition">
  19454.       <text variable="edition"/>
  19455.   </macro>
  19456.   <citation>
  19457.     <option name="et-al-min" value="6"/>
  19458.     <option name="et-al-use-first" value="1"/>
  19459.     <option name="et-al-subsequent-min" value="3"/>
  19460.     <option name="et-al-subsequent-use-first" value="1"/>
  19461.     <option name="disambiguate-add-year-suffix" value="true"/>
  19462.     <option name="disambiguate-add-names" value="true"/>
  19463.     <option name="disambiguate-add-givenname" value="true"/>
  19464.     <option name="collapse" value="year"/>
  19465.     <sort>
  19466.       <key macro="author"/>
  19467.       <key variable="issued"/>
  19468.     </sort>
  19469.     <layout prefix="(" suffix=")" delimiter="; ">
  19470.       <group delimiter=", ">
  19471.         <text macro="author-short"/>
  19472.         <text macro="issued-year"/>
  19473.         <text macro="citation-locator"/>
  19474.       </group>
  19475.     </layout>
  19476.   </citation>
  19477.   <bibliography>
  19478.     <option name="hanging-indent" value="true"/>
  19479.     <option name="et-al-min" value="6"/>
  19480.     <option name="et-al-use-first" value="6"/>
  19481.     <sort>
  19482.       <key macro="author"/>
  19483.       <key variable="issued"/>
  19484.     </sort>
  19485.     <layout suffix=".">
  19486.       <text macro="author" suffix="."/>
  19487.       <text macro="issued"/>
  19488.       <text macro="title" prefix=" "/>
  19489.       <text macro="container-prefix" prefix=" "/>
  19490.       <text macro="editor-translator" prefix=" "/>
  19491.       <text variable="container-title" prefix=", " font-style="italic"/>
  19492.       <text variable="collection-title" prefix=", " suffix="."/>
  19493.       <text macro="edition" prefix=" (" suffix=")"/>
  19494.       <text variable="volume" prefix=", "/>
  19495.       <text variable="issue" prefix="(" suffix=")"/>
  19496.       <text macro="pages"/>
  19497.       <text macro="publisher" prefix=". "/>
  19498.       <text macro="access" prefix=". " />
  19499.     </layout>
  19500.   </bibliography>
  19501. </style>
  19502. ');
  19503.  
  19504. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/apsa', '2008-02-02 00:00:00', 'American Political Science Association',
  19505. '<?xml version="1.0" encoding="UTF-8"?>
  19506. <style xmlns="http://purl.org/net/xbiblio/csl" xml:lang="en" class="in-text" >
  19507.   <info>
  19508.     <title>American Political Science Association</title>
  19509.     <id>http://www.zotero.org/styles/apsa</id>
  19510.     <link href="http://www.zotero.org/styles/apsa"/>
  19511.     <author>
  19512.       <name>Julian Onions</name>
  19513.       <email>julian.onions@gmail.com</email>
  19514.     </author>
  19515.     <category term="author-date"/>
  19516.     <category term="political_science"/>
  19517.     <updated>2008-02-02T00:00:00+00:00</updated>
  19518.     <summary>The American Political Science Association style.</summary>
  19519.     <link href="http://www.wisc.edu/writing/Handbook/DocAPSA.html" rel="documentation"/>
  19520.   </info>
  19521.   <macro name="editor">
  19522.     <names variable="editor" delimiter=", ">
  19523.       <label form="short" text-case="lowercase" suffix=". "/>
  19524.       <name and="text"  delimiter=", "/>
  19525.     </names>
  19526.   </macro>
  19527.   <macro name="author">
  19528.     <names variable="author">
  19529.       <name name-as-sort-order="first" and="text" sort-separator=", " 
  19530.         delimiter=", " delimiter-precedes-last="always"/>
  19531.       <label form="short" prefix=", " suffix="." text-case="lowercase"/>
  19532.       <substitute>
  19533.     <names variable="editor"/>
  19534.     <text variable="title"/>
  19535.       </substitute>
  19536.     </names>
  19537.   </macro>
  19538.   <macro name="author-short">
  19539.     <names variable="author">
  19540.       <name form="short" and="text" delimiter=", " initialize-with=". "/>
  19541.       <substitute>
  19542.     <names variable="editor"/>
  19543.     <names variable="translator"/>
  19544.     <text variable="title"/>
  19545.       </substitute>
  19546.     </names>
  19547.   </macro>
  19548.   <macro name="access">
  19549.     <group delimiter=" ">
  19550.       <text value="Available at:"/>
  19551.       <text variable="URL"/>
  19552.       <group prefix="[" suffix="]">
  19553.     <text term="accessed" text-case="capitalize-first" suffix=" "/>
  19554.     <date variable="accessed">
  19555.       <date-part name="month" suffix=" "/>
  19556.       <date-part name="day" suffix=", "/>
  19557.       <date-part name="year"/>
  19558.     </date>
  19559.       </group>
  19560.     </group>
  19561.   </macro>
  19562.   <macro name="title">
  19563.     <choose>
  19564.       <if type="book">
  19565.     <text variable="title" font-style="italic"/>
  19566.       </if>
  19567.       <else>
  19568.     <text variable="title"/>
  19569.       </else>
  19570.     </choose>
  19571.   </macro>
  19572.   <macro name="publisher">
  19573.     <group delimiter=": ">
  19574.       <text variable="publisher-place"/>
  19575.       <text variable="publisher"/>
  19576.     </group>
  19577.   </macro>
  19578.   <macro name="year-date">
  19579.     <group prefix=" ">
  19580.       <choose>
  19581.     <if variable="issued">
  19582.       <date variable="issued">
  19583.         <date-part name="year"/>
  19584.       </date>
  19585.     </if>
  19586.     <else>
  19587.       <text term="no date"/>
  19588.     </else>
  19589.       </choose>
  19590.     </group>
  19591.   </macro>
  19592.   <macro name="edition">
  19593.     <choose>
  19594.       <if is-numeric="edition">
  19595.     <group delimiter=" ">
  19596.       <number variable="edition" form="ordinal"/>
  19597.       <text term="edition" form="short" suffix="."/>
  19598.     </group>
  19599.       </if>
  19600.       <else>
  19601.       <text variable="edition" suffix="."/>
  19602.       </else>
  19603.     </choose>
  19604.   </macro>
  19605.   <citation>
  19606.     <option name="et-al-min" value="4"/>
  19607.     <option name="et-al-use-first" value="1"/>
  19608.     <option name="et-al-subsequent-min" value="6"/>
  19609.     <option name="et-al-subsequent-use-first" value="1"/>
  19610.     <option name="disambiguate-add-year-suffix" value="true"/>
  19611.     <option name="disambiguate-add-names" value="true"/>
  19612.     <option name="disambiguate-add-givenname" value="true"/>
  19613.     <option name="collapse" value="year"/>
  19614.     <layout prefix="(" suffix=")" delimiter="; ">
  19615.       <group delimiter=", ">
  19616.     <group delimiter=" ">
  19617.       <text macro="author-short"/>
  19618.       <text macro="year-date"/>
  19619.     </group>
  19620.     <text variable="locator"/>
  19621.       </group>
  19622.     </layout>
  19623.   </citation>
  19624.   <bibliography>
  19625.     <option name="hanging-indent" value="true"/>
  19626.     <option name="et-al-min" value="4"/>
  19627.     <option name="et-al-use-first" value="1"/>
  19628.     <sort>
  19629.       <key macro="author"/>
  19630.       <key variable="title"/>
  19631.     </sort>
  19632.     <layout>
  19633.       <text macro="author" suffix="."/>
  19634.       <date variable="issued" prefix=" " suffix=".">
  19635.     <date-part name="year"/>
  19636.       </date>
  19637.       <choose>
  19638.     <if type="book">
  19639.       <group prefix=" " delimiter=" ">
  19640.         <text macro="title" suffix="."/>
  19641.         <text macro="edition"/>
  19642.         <text macro="editor" suffix="."/>
  19643.       </group>
  19644.       <text prefix=" " suffix="." macro="publisher"/>
  19645.     </if>
  19646.     <else-if type="chapter">
  19647.       <text macro="title" prefix=" " suffix="." quotes="true"/>
  19648.       <group class="container" prefix=" " delimiter=" ">
  19649.         <text term="in" text-case="capitalize-first"/>
  19650.         <text variable="container-title" font-style="italic" suffix=","/>
  19651.         <text variable="collection-title" suffix=","/>
  19652.         <text macro="editor" suffix="."/>
  19653.         <group suffix=".">
  19654.           <text macro="publisher" prefix=" "/>
  19655.           <group prefix=", ">
  19656.         <text variable="page" prefix="p. "/>
  19657.           </group>
  19658.         </group>
  19659.       </group>
  19660.     </else-if>
  19661.     <else>
  19662.       <group prefix=" " delimiter=" " suffix=".">
  19663.         <text macro="title" quotes="true"/>
  19664.         <text macro="editor" />
  19665.       </group>
  19666.       <group class="container" prefix=" " suffix=".">
  19667.         <text variable="container-title" font-style="italic"/>
  19668.         <group prefix=" ">
  19669.           <text variable="volume" />
  19670.           <text variable="issue" prefix="(" suffix=")"/>
  19671.         </group>
  19672.         <text variable="page" prefix=":"/>
  19673.       </group>
  19674.     </else>
  19675.       </choose>
  19676.       <text prefix=" " macro="access" suffix="."/>
  19677.     </layout>
  19678.   </bibliography>
  19679. </style>
  19680. ');
  19681.  
  19682. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/asa', '2008-02-02 00:00:00', 'American Sociological Association (Author-Date)',
  19683. '<?xml version="1.0" encoding="UTF-8"?>
  19684. <style xmlns="http://purl.org/net/xbiblio/csl" xml:lang="en" class="in-text" >
  19685.   <info>
  19686.     <title>American Sociological Association (Author-Date)</title>
  19687.     <id>http://www.zotero.org/styles/asa</id>
  19688.     <link href="http://www.zotero.org/styles/asa"/>
  19689.     <author>
  19690.       <name>Julian Onions</name>
  19691.       <email>julian.onions@gmail.com</email>
  19692.     </author>
  19693.     <category term="author-date"/>
  19694.     <category term="sociology"/>
  19695.     <updated>2008-02-02T00:00:00+00:00</updated>
  19696.     <summary>The ASA style.</summary>
  19697.     <link href="http://www.asanet.org/page.ww?name=Quick+Style+Guide%38section=Sociology+Depts" rel="documentation"/>
  19698.   </info>
  19699.   <macro name="editor">
  19700.     <names variable="editor">
  19701.       <label form="verb" text-case="lowercase" suffix=" "/>
  19702.       <name and="text" delimiter=", "/>
  19703.     </names>
  19704.   </macro>
  19705.   <macro name="series-editor">
  19706.     <names variable="original-author">
  19707.       <label form="short" text-case="capitalize-first" suffix=". "/>
  19708.       <name and="text" delimiter=", "/>
  19709.     </names>
  19710.   </macro>
  19711.   <macro name="anon">
  19712.     <text term="anonymous" form="short" text-case="capitalize-first"/>
  19713.   </macro>
  19714.   <macro name="author">
  19715.     <names variable="author">
  19716.       <name and="text" name-as-sort-order="first" sort-separator=", " delimiter=", "
  19717.         delimiter-precedes-last="always"/>
  19718.       <label form="short" prefix=", " suffix="." text-case="lowercase"/>
  19719.       <substitute>
  19720.     <names variable="editor"/>
  19721.     <names variable="translator"/>
  19722.     <text macro="anon"/>
  19723.       </substitute>
  19724.     </names>
  19725.   </macro>
  19726.   <macro name="author-short">
  19727.     <names variable="author">
  19728.       <name form="short" and="text" delimiter=", "/>
  19729.       <substitute>
  19730.     <names variable="editor"/>
  19731.     <names variable="translator"/>
  19732.     <text macro="anon"/>
  19733.       </substitute>
  19734.     </names>
  19735.   </macro>
  19736.   <macro name="access">
  19737.     <group>
  19738.       <text variable="URL"/>
  19739.       <group prefix=" (" suffix=")">
  19740.     <text term="accessed" text-case="capitalize-first" suffix=" "/>
  19741.     <date variable="accessed">
  19742.       <date-part name="month" suffix=" "/>
  19743.       <date-part name="day" suffix=", "/>
  19744.       <date-part name="year"/>
  19745.     </date>
  19746.       </group>
  19747.     </group>
  19748.   </macro>
  19749.   <macro name="title">
  19750.     <choose>
  19751.       <if type="thesis">
  19752.     <text variable="title"/>
  19753.       </if>
  19754.       <else-if type="book">
  19755.     <text variable="title" font-style="italic"/>
  19756.       </else-if>
  19757.       <else>
  19758.     <text variable="title" quotes="true"/>
  19759.       </else>
  19760.     </choose>
  19761.   </macro>
  19762.   <macro name="publisher">
  19763.     <group delimiter=": " >
  19764.       <text variable="publisher-place"/>
  19765.       <text variable="publisher"/>
  19766.     </group>
  19767.   </macro>
  19768.   <macro name="year-date">
  19769.     <choose>
  19770.       <if variable="issued">
  19771.     <date variable="issued">
  19772.       <date-part name="year"/>
  19773.     </date>
  19774.       </if>
  19775.       <else>
  19776.     <text term="no date" form="short"/>
  19777.       </else>
  19778.     </choose>
  19779.   </macro>
  19780.   <macro name="day-month">
  19781.     <date variable="issued">
  19782.       <date-part name="month"/>
  19783.       <date-part name="day" prefix=" "/>
  19784.     </date>
  19785.     
  19786.   </macro>
  19787.   <macro name="pages">
  19788.     <label variable="page" form="short" suffix=". " text-case="capitalize-first"/>
  19789.     <text variable="page"/>
  19790.   </macro>
  19791.   <macro name="edition">
  19792.     <choose>
  19793.       <if is-numeric="edition">
  19794.     <group delimiter=" ">
  19795.       <number variable="edition" form="ordinal"/>
  19796.       <text term="edition" form="short" suffix="."/>
  19797.     </group>
  19798.       </if>
  19799.       <else>
  19800.       <text variable="edition" suffix="."/>
  19801.       </else>
  19802.     </choose>
  19803.   </macro>
  19804.   <citation>
  19805.     <option name="et-al-min" value="3"/>
  19806.     <option name="et-al-use-first" value="1"/>
  19807.     <option name="et-al-subsequent-min" value="6"/>
  19808.     <option name="et-al-subsequent-use-first" value="1"/>
  19809.     <option name="disambiguate-add-year-suffix" value="true"/>
  19810.     <option name="disambiguate-add-names" value="true"/>
  19811.     <option name="disambiguate-add-givenname" value="true"/>
  19812.     <option name="collapse" value="year"/>
  19813.     <layout prefix="(" suffix=")" delimiter="; ">
  19814.       <group delimiter=":">
  19815.     <group delimiter=" ">
  19816.       <text macro="author-short"/>
  19817.       <text macro="year-date"/>
  19818.     </group>
  19819.     <text variable="locator"/>
  19820.       </group>
  19821.     </layout>
  19822.   </citation>
  19823.   <bibliography>
  19824.     <option name="hanging-indent" value="true"/>
  19825.     <option name="et-al-min" value="6"/>
  19826.     <option name="et-al-use-first" value="1"/>
  19827.     <sort>
  19828.       <key macro="author"/>
  19829.       <key variable="title"/>
  19830.     </sort>
  19831.     <layout suffix=".">
  19832.       <group delimiter=" ">
  19833.     <text macro="author" suffix="."/>
  19834.     <text macro="year-date" suffix="."/>
  19835.       </group>
  19836.       <choose>
  19837.     <if type="article-newspaper article-magazine" match="any">
  19838.       <group delimiter=" ">
  19839.         <text macro="title" prefix=" " suffix="."/>
  19840.       </group>
  19841.       <group prefix=" " delimiter=", ">
  19842.         <text variable="container-title" font-style="italic"/>
  19843.         <text macro="day-month"/>
  19844.         <text variable="edition"/>
  19845.         <text variable="page"/>
  19846.       </group>
  19847.     </if>
  19848.     <else-if type="thesis">
  19849.       <text macro="title" prefix=" " suffix="." quotes="true"/>
  19850.       <group prefix=" " delimiter=", ">
  19851.         <text macro="edition" />
  19852.         <text macro="editor" suffix="."/>
  19853.         <text variable="genre"/>
  19854.         <text macro="publisher"/>
  19855.       </group>
  19856.     </else-if>
  19857.     <else-if type="book">
  19858.       <group delimiter=" ">
  19859.         <text macro="title" prefix=" " suffix="."/>
  19860.         <text macro="edition" />
  19861.         <text macro="editor" suffix="."/>
  19862.         <text macro="publisher"/>
  19863.       </group>
  19864.     </else-if>
  19865.     <else-if type="chapter">
  19866.       <group delimiter=" ">
  19867.         <text macro="title" prefix=" " suffix="."/>
  19868.         <group class="container" delimiter=", " suffix=".">
  19869.           <group delimiter=" ">
  19870.         <text macro="pages"/>
  19871.         <text term="in" text-case="lowercase"/>
  19872.         <text variable="container-title" font-style="italic"/>
  19873.           </group>
  19874.           <text variable="volume" prefix="vol. "/>
  19875.           <text variable="collection-title" font-style="italic"/>
  19876.           <text macro="editor" prefix=" "/>
  19877.         </group>
  19878.         <text macro="publisher" prefix=" "/>
  19879.       </group>
  19880.     </else-if>
  19881.     <else>
  19882.       <group suffix="." >
  19883.         <text macro="title" prefix=" " />
  19884.         <text macro="editor" prefix=" "/>
  19885.       </group>
  19886.       <group class="container" prefix=" " suffix="." delimiter=" ">
  19887.         <text variable="container-title" font-style="italic"/>
  19888.         <group delimiter=":">
  19889.           <text variable="volume" />
  19890.           <text variable="page"/>
  19891.         </group>
  19892.       </group>
  19893.     </else>
  19894.       </choose>
  19895.       <text prefix=" " macro="access" suffix="."/>
  19896.     </layout>
  19897.   </bibliography>
  19898. </style>
  19899. ');
  19900.  
  19901. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/chicago-author-date', '2008-02-02 00:00:00', 'Chicago Manual of Style (Author-Date format)',
  19902. '<?xml version="1.0" encoding="UTF-8"?>
  19903. <style xmlns="http://purl.org/net/xbiblio/csl" xml:lang="en" class="in-text" >
  19904.   <info>
  19905.     <title>Chicago Manual of Style (Author-Date format)</title>
  19906.     <id>http://www.zotero.org/styles/chicago-author-date</id>
  19907.     <link href="http://www.zotero.org/styles/chicago-author-date"/>
  19908.     <author>
  19909.       <name>Julian Onions</name>
  19910.       <email>julian.onions@gmail.com</email>
  19911.     </author>
  19912.     <category term="author-date"/>
  19913.     <category term="generic-base"/>
  19914.     <updated>2008-02-02T00:00:00+00:00</updated>
  19915.     <summary>The author-date variant of the Chicago style</summary>
  19916.     <link href="http://www.chicagomanualofstyle.org/tools_citationguide.html" rel="documentation"/>
  19917.   </info>
  19918.   <macro name="secondary-contributor">
  19919.     <group delimiter=". ">
  19920.       <names variable="editor">
  19921.         <label form="verb-short" prefix=" " text-case="capitalize-first" suffix=". "/>
  19922.         <name and="text" delimiter=", "/>
  19923.       </names>
  19924.       <choose>
  19925.         <if variable="author editor" match="any">
  19926.       <names variable="translator">
  19927.         <label form="verb-short" prefix=" " text-case="capitalize-first" suffix=". "/>
  19928.         <name and="text" delimiter=", "/>
  19929.       </names>
  19930.         </if>
  19931.       </choose>
  19932.     </group>
  19933.   </macro>
  19934.   <macro name="series-editor">
  19935.     <names variable="original-author">
  19936.       <label form="short" text-case="capitalize-first" suffix=". "/>
  19937.       <name and="text" delimiter=", "/>
  19938.     </names>
  19939.   </macro>
  19940.   <macro name="anon">
  19941.     <text term="anonymous" form="short" text-case="capitalize-first"/>
  19942.   </macro>
  19943.   <macro name="author">
  19944.     <names variable="author">
  19945.       <name and="text" name-as-sort-order="first" sort-separator=", " delimiter=", "
  19946.         delimiter-precedes-last="always"/>
  19947.       <label form="verb-short" prefix=", " suffix="." text-case="lowercase"/>
  19948.       <substitute>
  19949.     <names variable="editor"/>
  19950.     <names variable="translator"/>
  19951.     <text macro="anon"/>
  19952.       </substitute>
  19953.     </names>
  19954.   </macro>
  19955.   <macro name="author-short">
  19956.     <names variable="author">
  19957.       <name form="short" and="text" delimiter=", "/>
  19958.       <substitute>
  19959.     <names variable="editor"/>
  19960.     <names variable="translator"/>
  19961.     <text macro="anon"/>
  19962.       </substitute>
  19963.     </names>
  19964.   </macro>
  19965.   <macro name="access">
  19966.     <group>
  19967.       <text variable="URL"/>
  19968.       <group prefix=" (" suffix=")">
  19969.     <text term="accessed" text-case="capitalize-first" suffix=" "/>
  19970.     <date variable="accessed">
  19971.       <date-part name="month" suffix=" "/>
  19972.       <date-part name="day" suffix=", "/>
  19973.       <date-part name="year"/>
  19974.     </date>
  19975.       </group>
  19976.     </group>
  19977.   </macro>
  19978.   <macro name="title">
  19979.     <choose>
  19980.       <if type="thesis">
  19981.     <text variable="title"/>
  19982.       </if>
  19983.       <else-if type="book">
  19984.     <text variable="title" font-style="italic"/>
  19985.       </else-if>
  19986.       <else>
  19987.     <text variable="title"/>
  19988.       </else>
  19989.     </choose>
  19990.   </macro>
  19991.   <macro name="edition">
  19992.     <choose>
  19993.       <if is-numeric="edition">
  19994.     <group delimiter=" ">
  19995.       <number variable="edition" form="ordinal"/>
  19996.       <text term="edition" form="short" suffix="."/>
  19997.     </group>
  19998.       </if>
  19999.       <else>
  20000.       <text variable="edition" suffix="."/>
  20001.       </else>
  20002.     </choose>
  20003.   </macro>
  20004.   <macro name="volumes">
  20005.     <group delimiter=" ">
  20006.       <number variable="number-of-volumes" form="numeric"/>
  20007.       <text term="volume" form="short" suffix="." plural="true"/>
  20008.     </group>
  20009.   </macro>
  20010.   <macro name="publisher">
  20011.     <group delimiter=": " >
  20012.       <text variable="publisher-place"/>
  20013.       <text variable="publisher"/>
  20014.     </group>
  20015.   </macro>
  20016.   <macro name="year-date">
  20017.     <date variable="issued">
  20018.       <date-part name="year"/>
  20019.     </date>
  20020.   </macro>
  20021.   <macro name="day-month">
  20022.     <date variable="issued">
  20023.       <date-part name="month"/>
  20024.       <date-part name="day" prefix=" "/>
  20025.     </date>
  20026.   </macro>
  20027.   <citation>
  20028.     <option name="et-al-min" value="4"/>
  20029.     <option name="et-al-use-first" value="1"/>
  20030.     <option name="et-al-subsequent-min" value="6"/>
  20031.     <option name="et-al-subsequent-use-first" value="1"/>
  20032.     <option name="disambiguate-add-year-suffix" value="true"/>
  20033.     <option name="disambiguate-add-names" value="true"/>
  20034.     <option name="disambiguate-add-givenname" value="true"/>
  20035.     <option name="collapse" value="year"/>
  20036.     <layout prefix="(" suffix=")" delimiter="; ">
  20037.       <group delimiter=", ">
  20038.     <group delimiter=" ">
  20039.       <text macro="author-short"/>
  20040.       <text macro="year-date"/>
  20041.     </group>
  20042.     <text variable="locator"/>
  20043.       </group>
  20044.     </layout>
  20045.   </citation>
  20046.   <bibliography>
  20047.     <option name="hanging-indent" value="true"/>
  20048.     <option name="et-al-min" value="6"/>
  20049.     <option name="et-al-use-first" value="1"/>
  20050.     <sort>
  20051.       <key macro="author"/>
  20052.       <key variable="title"/>
  20053.     </sort>
  20054.     <layout suffix=".">
  20055.       <group delimiter=" ">
  20056.     <text macro="author" suffix="."/>
  20057.     <text macro="year-date" suffix="."/>
  20058.       </group>
  20059.       <choose>
  20060.     <if type="article-newspaper article-magazine" match="any">
  20061.       <group delimiter=" ">
  20062.         <text macro="title" prefix=" " suffix="."/>
  20063.       </group>
  20064.       <group prefix=" " delimiter=", ">
  20065.         <text variable="container-title" font-style="italic"/>
  20066.         <text macro="day-month"/>
  20067.         <text variable="edition"/>
  20068.       </group>
  20069.     </if>
  20070.     <else-if type="thesis">
  20071.       <text macro="title" prefix=" " suffix="."/>
  20072.       <group prefix=" " delimiter=", ">
  20073.         <text variable="edition" suffix=" ed."/>
  20074.         <text macro="secondary-contributor" suffix="."/>
  20075.         <text variable="genre"/>
  20076.         <text macro="publisher"/>
  20077.       </group>
  20078.     </else-if>
  20079.     <else-if type="book">
  20080.       <group delimiter=" ">
  20081.         <text macro="title" prefix=" " suffix="."/>
  20082.         <text macro="edition"/>
  20083.         <text macro="volumes"/>
  20084.         <text macro="secondary-contributor" suffix="."/>
  20085.         <text macro="publisher"/>
  20086.       </group>
  20087.     </else-if>
  20088.     <else-if type="chapter">
  20089.       <group delimiter=" ">
  20090.         <text macro="title" prefix=" " suffix="."/>
  20091.         <group class="container" delimiter=", ">
  20092.           <group delimiter=" ">
  20093.         <text term="in" text-case="capitalize-first"/>
  20094.         <text variable="container-title" font-style="italic"/>
  20095.           </group>
  20096.           <text macro="secondary-contributor" prefix=" "/>
  20097.           <group delimiter=" ">
  20098.         <text variable="volume" prefix="Vol. " suffix=" of"/>
  20099.         <text variable="collection-title" font-style="italic"/>
  20100.         <text macro="series-editor"/>
  20101.           </group>
  20102.           <text variable="page"/>
  20103.           <text macro="publisher" prefix=" "/>
  20104.         </group>
  20105.       </group>
  20106.     </else-if>
  20107.     <else>
  20108.       <group suffix="." >
  20109.         <text macro="title" prefix=" " />
  20110.         <text macro="secondary-contributor" prefix=" "/>
  20111.       </group>
  20112.       <group class="container" prefix=" " suffix="." delimiter=" ">
  20113.         <text variable="container-title" font-style="italic"/>
  20114.         <group delimiter=":">
  20115.           <group delimiter=", ">
  20116.         <text variable="volume" />
  20117.         <text variable="issue" prefix="no. "/>
  20118.           </group>
  20119.           <text variable="page"/>
  20120.         </group>
  20121.       </group>
  20122.     </else>
  20123.       </choose>
  20124.       <text prefix=" " macro="access" suffix="."/>
  20125.     </layout>
  20126.   </bibliography>
  20127. </style>
  20128. ');
  20129.  
  20130. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/chicago-fullnote-bibliography', '2008-02-02 00:00:00', 'Chicago Manual of Style (Full Note with Bibliography)',
  20131. '<style xmlns="http://purl.org/net/xbiblio/csl" class="note" xml:lang="en"> 
  20132.   <info>
  20133.     <title>Chicago Manual of Style (Full Note with Bibliography)</title>
  20134.     <id>http://www.zotero.org/styles/chicago-fullnote-bibliography</id>
  20135.     <link href="http://www.zotero.org/styles/chicago-fullnote-bibliography"/>
  20136.     <link href="http://www.chicagomanualofstyle.org/tools_citationguide.html" rel="documentation"/>
  20137.     <author>
  20138.       <name>Julian Onions</name>
  20139.       <email>julian.onions@gmail.com</email>
  20140.     </author>
  20141.     <contributor>
  20142.       <name>Simon Kornblith</name>
  20143.       <email>simon@simonster.com</email> 
  20144.     </contributor>
  20145.     <contributor>
  20146.       <name>Elena Razlogova</name>
  20147.       <email>elena.razlogova@gmail.com</email> 
  20148.     </contributor>
  20149.     <summary>Chicago format with full notes and bibliography</summary>
  20150.     <category term="generic-base"/>
  20151.     <category term="numeric"/>
  20152.     <updated>2008-02-02T00:00:00+00:00</updated>
  20153.   </info>
  20154.   <macro name="translator">
  20155.     <choose>
  20156.       <if variable="author editor" match="any">
  20157.     <names variable="translator" delimiter=", ">
  20158.       <label form="verb-short" prefix=" " text-case="lowercase" suffix=". "/>
  20159.       <name and="text" delimiter=", "/>
  20160.     </names>
  20161.       </if>
  20162.     </choose>
  20163.   </macro>
  20164.   <macro name="translator-bib">
  20165.     <choose>
  20166.       <if variable="author editor" match="any">
  20167.     <names variable="translator" delimiter=". ">
  20168.       <label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
  20169.       <name and="text" delimiter=", "/>
  20170.     </names>
  20171.       </if>
  20172.     </choose>
  20173.   </macro>
  20174.   <macro name="secondary-contributor">
  20175.     <group delimiter=", ">
  20176.       <names variable="editor" delimiter=", ">
  20177.         <label form="verb-short" prefix=" " text-case="lowercase" suffix=". "/>
  20178.         <name and="text" delimiter=", "/>
  20179.       </names>
  20180.       <choose>
  20181.         <if type="article-journal article-magazine article-newspaper" match="none">
  20182.       <text macro="translator"/>
  20183.         </if>
  20184.       </choose>
  20185.     </group>
  20186.   </macro>
  20187.   <macro name="secondary-contributor-bib">
  20188.     <group delimiter=". ">
  20189.       <names variable="editor" delimiter=". ">
  20190.         <label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
  20191.         <name and="text" delimiter=", "/>
  20192.       </names>
  20193.       <choose>
  20194.         <if type="article-journal article-magazine article-newspaper" match="none">
  20195.       <text macro="translator-bib"/>
  20196.         </if>
  20197.       </choose>
  20198.     </group>
  20199.   </macro>
  20200.   <macro name="translator-article">
  20201.     <choose>
  20202.       <if type="article-journal article-magazine article-newspaper" match="any">
  20203.         <text macro="translator"/>
  20204.       </if>
  20205.     </choose>
  20206.   </macro>
  20207.   <macro name="translator-article-bib">
  20208.     <choose>
  20209.       <if type="article-journal article-magazine article-newspaper" match="any">
  20210.         <text macro="translator-bib"/>
  20211.       </if>
  20212.     </choose>
  20213.   </macro>
  20214.   <macro name="author">
  20215.     <names variable="author">
  20216.       <name and="text" sort-separator=", "
  20217.         delimiter=", "/>
  20218.       <label form="verb-short" prefix=", " suffix="."/>
  20219.       <substitute>
  20220.     <names variable="editor"/>
  20221.     <names variable="translator"/>
  20222.       </substitute>
  20223.     </names>
  20224.   </macro> 
  20225.   <macro name="author-bib">
  20226.     <names variable="author">
  20227.       <name name-as-sort-order="first" and="text" sort-separator=", "
  20228.         delimiter=", " delimiter-precedes-last="always"/>
  20229.       <label form="verb-short" prefix=", " suffix="."/>
  20230.       <substitute>
  20231.     <names variable="editor"/>
  20232.     <names variable="translator"/>
  20233.       </substitute>
  20234.     </names>
  20235.   </macro>
  20236.   <macro name="author-short">
  20237.     <names variable="author">
  20238.       <name form="short" and="text" delimiter=", " />
  20239.       <label form="verb-short" prefix=", " suffix="."/>
  20240.       <substitute>
  20241.     <names variable="editor"/>
  20242.     <names variable="translator"/>
  20243.       </substitute>
  20244.     </names>
  20245.   </macro>
  20246.   <macro name="author-sort">
  20247.     <names variable="author">
  20248.       <name name-as-sort-order="all" and="text" sort-separator=", "
  20249.         delimiter=", " delimiter-precedes-last="always"/>
  20250.       <label form="verb-short" prefix=", " suffix="."/>
  20251.       <substitute>
  20252.     <names variable="editor"/>
  20253.     <names variable="translator"/>
  20254.       </substitute>
  20255.     </names>
  20256.   </macro>
  20257.   <macro name="recipient">
  20258.     <names variable="recipient" delimiter=", ">
  20259.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  20260.       <name and="text" delimiter=", "/>
  20261.     </names>
  20262.   </macro>
  20263.   <macro name="recipient-bib">
  20264.     <choose>
  20265.       <if type="personal_communication">
  20266.         <choose>
  20267.             <if variable="genre">
  20268.         <text variable="genre" text-case="capitalize-first"/>
  20269.             </if>
  20270.             <else>
  20271.         <text term="letter" text-case="capitalize-first"/>
  20272.           </else>
  20273.         </choose>
  20274.       </if>
  20275.     </choose>
  20276.     <text macro="recipient" prefix=" "/>
  20277.   </macro>
  20278.   <macro name="recipient-short">
  20279.     <names variable="recipient"> 
  20280.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  20281.       <name form="short" and="text" delimiter=", " />
  20282.     </names>
  20283.   </macro>
  20284.   <macro name="interviewer">
  20285.     <names variable="interviewer" delimiter=", ">
  20286.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  20287.       <name and="text" delimiter=", "/>
  20288.     </names>
  20289.   </macro>
  20290.   <macro name="interviewer-bib">
  20291.     <names variable="interviewer" delimiter=", ">
  20292.       <label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
  20293.       <name and="text" delimiter=", "/>
  20294.     </names>
  20295.   </macro>
  20296.   <macro name="title">
  20297.     <choose>
  20298.       <if variable="title" match="none">
  20299.         <text variable="genre"/>
  20300.       </if>
  20301.       <else-if type="book">
  20302.         <text variable="title" font-style="italic"/>
  20303.       </else-if>
  20304.       <else>
  20305.         <text variable="title" quotes="true"/>
  20306.       </else>
  20307.     </choose>
  20308.   </macro>
  20309.   <macro name="title-bib">
  20310.     <choose>
  20311.       <if variable="title" match="none">
  20312.         <text variable="genre" text-case="capitalize-first"/>
  20313.       </if>
  20314.       <else-if type="book">
  20315.         <text variable="title" font-style="italic"/>
  20316.       </else-if>
  20317.       <else>
  20318.         <text variable="title" quotes="true"/>
  20319.       </else>
  20320.     </choose>
  20321.   </macro>
  20322.   <macro name="title-short">
  20323.     <choose>
  20324.       <if variable="title" match="none">
  20325.         <choose>
  20326.           <if type="interview">
  20327.             <text term="interview" text-case="lowercase"/>
  20328.           </if>
  20329.           <else-if type="manuscript paper-conference" match="any">
  20330.             <text variable="genre" form="short"/>
  20331.           </else-if>
  20332.           <else-if type="personal_communication">
  20333.             <text macro="issued"/>
  20334.           </else-if>
  20335.         </choose>
  20336.       </if>
  20337.       <else-if type="book">
  20338.         <text variable="title" form="short" font-style="italic"/>
  20339.       </else-if>
  20340.       <else>
  20341.         <text variable="title" form="short" quotes="true"/>
  20342.       </else>
  20343.     </choose>
  20344.   </macro>
  20345.   <macro name="description">
  20346.     <group delimiter=", ">
  20347.       <text macro="interviewer"/>
  20348.       <text variable="medium"/>
  20349.       <choose>
  20350.         <if variable="title" match="none"> </if>
  20351.         <else-if type="thesis paper-conference" match="any"> </else-if>
  20352.         <else>
  20353.           <text variable="genre"/>
  20354.         </else>
  20355.       </choose>
  20356.     </group>
  20357.   </macro>
  20358.   <macro name="description-bib">
  20359.     <group delimiter=", ">
  20360.       <group delimiter=". ">
  20361.         <text macro="interviewer-bib"/>
  20362.         <text variable="medium" text-case="capitalize-first"/>
  20363.       </group>
  20364.       <choose>
  20365.         <if variable="title" match="none"> </if>
  20366.         <else-if type="thesis paper-conference" match="any"> </else-if>
  20367.         <else>
  20368.           <text variable="genre" text-case="capitalize-first"/>
  20369.         </else>
  20370.       </choose>
  20371.     </group>
  20372.   </macro>
  20373.   <macro name="container-prefix">
  20374.     <choose>
  20375.       <if type="chapter">
  20376.     <text term="in" text-case="lowercase" suffix=" "/>
  20377.       </if>
  20378.     </choose>
  20379.   </macro>
  20380.   <macro name="container-prefix-bib">
  20381.     <choose>
  20382.       <if type="chapter">
  20383.     <text term="in" text-case="capitalize-first" suffix=" "/>
  20384.       </if>
  20385.     </choose>
  20386.   </macro>
  20387.   <macro name="locators">
  20388.     <choose>
  20389.       <if type="article-journal">
  20390.         <text variable="volume" prefix=" "/>
  20391.         <text variable="issue" prefix=", no. "/>
  20392.       </if>
  20393.       <else-if type="book">
  20394.         <group prefix=", " delimiter=", ">
  20395.           <group>
  20396.             <text term="volume" form="short" suffix=". "/>
  20397.             <number variable="volume" form="numeric"/>
  20398.           </group>
  20399.           <choose>
  20400.             <if variable="locator" match="none">
  20401.           <group>
  20402.             <number variable="number-of-volumes" form="numeric"/>
  20403.             <text term="volume" form="short" prefix=" " suffix="." plural="true"/>
  20404.           </group>
  20405.             </if>
  20406.           </choose>
  20407.           <text variable="edition"/>
  20408.         </group>
  20409.       </else-if>
  20410.     </choose>
  20411.   </macro>
  20412.   <macro name="locators-bib">
  20413.     <choose>
  20414.       <if type="article-journal">
  20415.         <text variable="volume" prefix=" "/>
  20416.         <text variable="issue" prefix=", no. "/>
  20417.       </if>
  20418.       <else-if type="book">
  20419.         <group prefix=". " delimiter=". ">
  20420.           <group>
  20421.             <text term="volume" form="short" text-case="capitalize-first" suffix=". "/>
  20422.             <number variable="volume" form="numeric"/>
  20423.           </group>
  20424.           <choose>
  20425.             <if variable="locator" match="none">
  20426.           <group>
  20427.             <number variable="number-of-volumes" form="numeric"/>
  20428.             <text term="volume" form="short" prefix=" " suffix="." plural="true"/>
  20429.           </group>
  20430.             </if>
  20431.           </choose>
  20432.           <text variable="edition"/>
  20433.         </group>
  20434.       </else-if>
  20435.     </choose>
  20436.   </macro>
  20437.   <macro name="locators-newspaper">
  20438.     <choose>
  20439.       <if type="article-newspaper">
  20440.         <group delimiter=", ">
  20441.           <group>
  20442.         <text variable="edition" suffix=" "/>
  20443.         <text term="edition" prefix=" "/>
  20444.           </group>
  20445.           <group>
  20446.         <text term="section" form="short" suffix=". "/>
  20447.         <text variable="section"/>
  20448.           </group>
  20449.         </group>
  20450.       </if>
  20451.     </choose>
  20452.   </macro>
  20453.   <macro name="event">
  20454.     <group>
  20455.       <text term="presented at" suffix=" "/>
  20456.       <text variable="event"/>
  20457.     </group>
  20458.   </macro>
  20459.   <macro name="publisher">
  20460.     <group delimiter=": ">
  20461.       <text variable="publisher-place"/>
  20462.       <text variable="publisher"/>
  20463.     </group>
  20464.   </macro>
  20465.   <macro name="issued">
  20466.     <choose>
  20467.       <if type="graphic report" match="any">
  20468.     <date variable="issued">
  20469.       <date-part name="month" suffix=" "/>
  20470.       <date-part name="day" suffix=", "/>
  20471.       <date-part name="year"/>
  20472.     </date>
  20473.       </if>
  20474.       <else-if type="book chapter thesis" match="any">
  20475.     <date variable="issued">
  20476.       <date-part name="year"/>
  20477.     </date>
  20478.       </else-if>
  20479.       <else>
  20480.     <date variable="issued">
  20481.       <date-part name="month" suffix=" "/>
  20482.       <date-part name="day" suffix=", "/>
  20483.       <date-part name="year"/>
  20484.     </date>
  20485.       </else>
  20486.     </choose>
  20487.   </macro>
  20488.   <macro name="locator">
  20489.     <choose>
  20490.       <if variable="locator" match="none">
  20491.         <text macro="pages"/>
  20492.       </if>
  20493.       <else-if type="article-journal">
  20494.         <text variable="locator" prefix=": "/>
  20495.       </else-if>
  20496.       <else>
  20497.         <text variable="locator" prefix=", "/>
  20498.       </else>
  20499.     </choose>
  20500.   </macro>
  20501.   <macro name="pages">
  20502.     <choose>
  20503.       <if type="article-journal">
  20504.     <text variable="page" prefix=": "/>
  20505.       </if>
  20506.       <else-if type="chapter">
  20507.     <text variable="page" prefix=", "/>
  20508.       </else-if>
  20509.     </choose>
  20510.   </macro>
  20511.   <macro name="pages-chapter">
  20512.     <choose>
  20513.       <if type="chapter">
  20514.     <text variable="page" prefix=", "/>
  20515.       </if>
  20516.     </choose>
  20517.   </macro>
  20518.   <macro name="pages-article">
  20519.     <choose>
  20520.       <if type="article-journal">
  20521.     <text variable="page" prefix=": "/>
  20522.       </if>
  20523.     </choose>
  20524.   </macro>
  20525.   <macro name="archive">
  20526.     <group delimiter=", ">
  20527.       <text variable="archive_location"/>
  20528.       <text variable="archive"/>
  20529.       <text variable="archive-place"/>
  20530.     </group>
  20531.   </macro>
  20532.   <macro name="archive-bib">
  20533.     <group delimiter=". ">
  20534.       <text variable="archive_location" text-case="capitalize-first"/>
  20535.       <text variable="archive"/>
  20536.       <text variable="archive-place"/>
  20537.     </group>
  20538.   </macro>
  20539.   <macro name="issue">
  20540.     <choose>
  20541.       <if type="article-journal">
  20542.         <text macro="issued" prefix=" (" suffix=")"/>
  20543.       </if>
  20544.       <else-if variable="publisher-place publisher" match="any">
  20545.         <group prefix=" (" suffix=")" delimiter=", ">
  20546.           <group delimiter=" ">
  20547.             <choose>
  20548.               <if variable="title" match="none"> </if>
  20549.               <else-if type="thesis paper-conference" match="any">
  20550.                 <text variable="genre"/>
  20551.               </else-if>
  20552.             </choose>
  20553.             <text macro="event"/>
  20554.           </group>
  20555.           <text macro="publisher"/>
  20556.           <text macro="issued"/>
  20557.         </group>
  20558.       </else-if>
  20559.       <else>
  20560.         <text macro="issued" prefix=", "/>
  20561.       </else>
  20562.     </choose>
  20563.   </macro>
  20564.   <macro name="issue-bib">
  20565.     <choose>
  20566.       <if type="article-journal">
  20567.         <text macro="issued" prefix=" (" suffix=")"/>
  20568.       </if>
  20569.       <else-if variable="publisher-place publisher" match="any">
  20570.         <choose>
  20571.           <if variable="title" match="none"> </if>
  20572.           <else-if type="paper-conference">
  20573.             <text variable="genre" text-case="capitalize-first" prefix=". "/>
  20574.           </else-if>
  20575.         </choose>
  20576.         <text macro="event" prefix=" "/>
  20577.         <group prefix=". " delimiter=", ">
  20578.           <choose>
  20579.             <if type="thesis">
  20580.               <text variable="genre" text-case="capitalize-first"/>
  20581.             </if>
  20582.           </choose>
  20583.           <text macro="publisher"/>
  20584.           <text macro="issued"/>
  20585.         </group>
  20586.       </else-if>
  20587.       <else>
  20588.         <text macro="issued" prefix=", "/>
  20589.       </else>
  20590.     </choose>
  20591.   </macro>
  20592.   <macro name="access">
  20593.     <group delimiter=", ">
  20594.       <choose>
  20595.         <if type="graphic report" match="any">
  20596.       <text macro="archive"/>
  20597.         </if>
  20598.         <else-if type="book thesis chapter article-journal article-newspaper article-magazine" match="none">
  20599.       <text macro="archive"/>
  20600.         </else-if>
  20601.       </choose>
  20602.       <text variable="URL"/>
  20603.     </group>
  20604.   </macro>
  20605.   <macro name="access-bib">
  20606.     <group delimiter=". ">
  20607.       <choose>
  20608.         <if type="graphic report" match="any">
  20609.       <text macro="archive-bib"/>
  20610.         </if>
  20611.         <else-if type="book thesis chapter article-journal article-newspaper article-magazine" match="none">
  20612.       <text macro="archive-bib"/>
  20613.         </else-if>
  20614.       </choose>
  20615.       <text variable="URL"/>
  20616.     </group>
  20617.   </macro>
  20618.   <macro name="sort-key">
  20619.       <text macro="author-sort" suffix=" "/>
  20620.       <text variable="title" suffix=" "/>
  20621.       <text variable="genre"/>
  20622.   </macro>
  20623.   <citation>
  20624.     <option name="et-al-min" value="4"/>
  20625.     <option name="et-al-use-first" value="1"/>
  20626.     <option name="et-al-subsequent-min" value="4"/>
  20627.     <option name="et-al-subsequent-use-first" value="1"/>
  20628.     <option name="disambiguate-add-year-suffix" value="true"/>
  20629.     <option name="disambiguate-add-names" value="true"/>
  20630.     <option name="disambiguate-add-givenname" value="true"/>
  20631.     <layout prefix="" suffix="." delimiter="; ">
  20632.       <choose>
  20633.         <if position="ibid-with-locator">
  20634.           <group delimiter=", ">
  20635.             <text term="ibid" text-case="capitalize-first" suffix="."/>
  20636.             <text variable="locator"/>
  20637.           </group>
  20638.         </if>
  20639.         <else-if position="ibid">
  20640.           <text term="ibid" text-case="capitalize-first" suffix="."/>
  20641.         </else-if>
  20642.         <else-if position="subsequent">
  20643.           <group delimiter=", ">
  20644.             <group>
  20645.               <text macro="author-short"/>
  20646.               <text macro="recipient-short"/>
  20647.             </group>
  20648.             <text macro="title-short"/>
  20649.             <text variable="locator"/>
  20650.           </group>
  20651.         </else-if>
  20652.         <else>
  20653.           <group delimiter=", ">
  20654.             <group>
  20655.               <text macro="author"/>
  20656.               <text macro="recipient"/>
  20657.             </group>
  20658.             <text macro="title"/>
  20659.             <text macro="description"/>
  20660.             <text macro="translator-article"/>
  20661.             <group>
  20662.               <text macro="container-prefix"/>
  20663.               <text variable="container-title" font-style="italic"/>
  20664.             </group>
  20665.             <text macro="secondary-contributor"/>
  20666.           </group>
  20667.           <text macro="locators"/>
  20668.           <text variable="collection-title" prefix=", "/>
  20669.           <text macro="issue"/>
  20670.           <text macro="locators-newspaper" prefix=", "/>
  20671.           <text macro="locator"/>
  20672.           <text macro="access" prefix=", "/>
  20673.         </else>
  20674.       </choose>
  20675.     </layout>
  20676.   </citation> 
  20677.   <bibliography>
  20678.     <option name="hanging-indent" value="true"/>
  20679.     <option name="et-al-min" value="6"/>
  20680.     <option name="et-al-use-first" value="6"/>
  20681.     <option name="subsequent-author-substitute" value="---"/>
  20682.     <sort>
  20683.       <key macro="sort-key"/>
  20684.     </sort>
  20685.     <layout suffix=".">
  20686.       <group delimiter=". ">
  20687.         <text macro="author-bib"/>
  20688.         <text macro="recipient-bib"/>
  20689.         <text macro="title-bib"/>
  20690.         <text macro="description-bib"/>
  20691.         <text macro="translator-article-bib"/>
  20692.         <group>
  20693.           <text macro="container-prefix-bib"/>
  20694.           <text variable="container-title" font-style="italic"/>
  20695.           <text macro="pages-chapter"/>
  20696.         </group>
  20697.         <text macro="secondary-contributor-bib"/>
  20698.       </group>
  20699.       <text macro="locators-bib"/>
  20700.       <text variable="collection-title" text-case="capitalize-first" prefix=". "/>
  20701.       <text macro="issue-bib"/>
  20702.       <text macro="locators-newspaper" prefix=", "/>
  20703.       <text macro="pages-article"/>
  20704.       <text macro="access-bib" prefix=". "/>
  20705.     </layout>
  20706.   </bibliography>
  20707. </style>
  20708. ');
  20709.  
  20710. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/chicago-note-bibliography', '2008-02-02 00:00:00', 'Chicago Manual of Style (Note with Bibliography)',
  20711. '<?xml version="1.0" encoding="UTF-8"?>
  20712. <?oxygen RNGSchema="http://xbiblio.svn.sourceforge.net/viewvc/*checkout*/xbiblio/csl/schema/trunk/csl.rnc" type="compact"?>
  20713. <style xmlns="http://purl.org/net/xbiblio/csl" class="note" xml:lang="en"> 
  20714.   <info>
  20715.     <title>Chicago Manual of Style (Note with Bibliography)</title>
  20716.     <id>http://www.zotero.org/styles/chicago-note-bibliography</id>
  20717.     <link href="http://www.zotero.org/styles/chicago-note-bibliography"/>
  20718.     <link href="http://www.chicagomanualofstyle.org/tools_citationguide.html" rel="documentation"/>
  20719.     <author>
  20720.       <name>Julian Onions</name>
  20721.       <email>julian.onions@gmail.com</email>
  20722.     </author>
  20723.     <contributor>
  20724.       <name>Simon Kornblith</name>
  20725.       <email>simon@simonster.com</email> 
  20726.     </contributor>
  20727.     <contributor>
  20728.       <name>Elena Razlogova</name>
  20729.       <email>elena.razlogova@gmail.com</email> 
  20730.     </contributor>
  20731.     <summary>Chicago format with short notes and full bibliography</summary>
  20732.     <category term="generic-base"/>
  20733.     <category term="numeric"/>
  20734.     <updated>2008-02-02T00:00:00+00:00</updated>
  20735.   </info>
  20736.   <macro name="translator-bib">
  20737.     <choose>
  20738.       <if variable="author editor" match="any">
  20739.     <names variable="translator" delimiter=". ">
  20740.       <label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
  20741.       <name and="text" delimiter=", "/>
  20742.     </names>
  20743.       </if>
  20744.     </choose>
  20745.   </macro>
  20746.   <macro name="secondary-contributor-bib">
  20747.     <group delimiter=". ">
  20748.       <names variable="editor" delimiter=". ">
  20749.         <label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
  20750.         <name and="text" delimiter=", "/>
  20751.       </names>
  20752.       <choose>
  20753.         <if type="article-journal article-magazine article-newspaper" match="none">
  20754.       <text macro="translator-bib"/>
  20755.         </if>
  20756.       </choose>
  20757.     </group>
  20758.   </macro>
  20759.   <macro name="translator-article-bib">
  20760.     <choose>
  20761.       <if type="article-journal article-magazine article-newspaper" match="any">
  20762.         <text macro="translator-bib"/>
  20763.       </if>
  20764.     </choose>
  20765.   </macro>
  20766.   <macro name="author-bib">
  20767.     <names variable="author">
  20768.       <name name-as-sort-order="first" and="text" sort-separator=", "
  20769.         delimiter=", " delimiter-precedes-last="always"/>
  20770.       <label form="verb-short" prefix=", " suffix="."/>
  20771.       <substitute>
  20772.     <names variable="editor"/>
  20773.     <names variable="translator"/>
  20774.       </substitute>
  20775.     </names>
  20776.   </macro>
  20777.   <macro name="author-short">
  20778.     <names variable="author">
  20779.       <name form="short" and="text" delimiter=", " />
  20780.       <label form="verb-short" prefix=", " suffix="."/>
  20781.       <substitute>
  20782.     <names variable="editor"/>
  20783.     <names variable="translator"/>
  20784.       </substitute>
  20785.     </names>
  20786.   </macro>
  20787.   <macro name="author-sort">
  20788.     <names variable="author">
  20789.       <name name-as-sort-order="all" and="text" sort-separator=", "
  20790.         delimiter=", " delimiter-precedes-last="always"/>
  20791.       <label form="verb-short" prefix=", " suffix="."/>
  20792.       <substitute>
  20793.     <names variable="editor"/>
  20794.     <names variable="translator"/>
  20795.       </substitute>
  20796.     </names>
  20797.   </macro>
  20798.   <macro name="recipient">
  20799.     <names variable="recipient" delimiter=", ">
  20800.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  20801.       <name and="text" delimiter=", "/>
  20802.     </names>
  20803.   </macro>
  20804.   <macro name="recipient-bib">
  20805.     <choose>
  20806.       <if type="personal_communication">
  20807.         <choose>
  20808.             <if variable="genre">
  20809.         <text variable="genre" text-case="capitalize-first"/>
  20810.             </if>
  20811.             <else>
  20812.         <text term="letter" text-case="capitalize-first"/>
  20813.           </else>
  20814.         </choose>
  20815.       </if>
  20816.     </choose>
  20817.     <text macro="recipient" prefix=" "/>
  20818.   </macro>
  20819.   <macro name="recipient-short">
  20820.     <names variable="recipient"> 
  20821.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  20822.       <name form="short" and="text" delimiter=", " />
  20823.     </names>
  20824.   </macro>
  20825.   <macro name="interviewer-bib">
  20826.     <names variable="interviewer" delimiter=", ">
  20827.       <label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
  20828.       <name and="text" delimiter=", "/>
  20829.     </names>
  20830.   </macro>
  20831.   <macro name="title-bib">
  20832.     <choose>
  20833.       <if variable="title" match="none">
  20834.         <text variable="genre" text-case="capitalize-first"/>
  20835.       </if>
  20836.       <else-if type="book">
  20837.         <text variable="title" font-style="italic"/>
  20838.       </else-if>
  20839.       <else>
  20840.         <text variable="title" quotes="true"/>
  20841.       </else>
  20842.     </choose>
  20843.   </macro>
  20844.   <macro name="title-short">
  20845.     <choose>
  20846.       <if variable="title" match="none">
  20847.         <choose>
  20848.           <if type="interview">
  20849.             <text term="interview" text-case="lowercase"/>
  20850.           </if>
  20851.           <else-if type="manuscript paper-conference" match="any">
  20852.             <text variable="genre" form="short"/>
  20853.           </else-if>
  20854.           <else-if type="personal_communication">
  20855.             <text macro="issued"/>
  20856.           </else-if>
  20857.         </choose>
  20858.       </if>
  20859.       <else-if type="book">
  20860.         <text variable="title" form="short" font-style="italic"/>
  20861.       </else-if>
  20862.       <else>
  20863.         <text variable="title" form="short" quotes="true"/>
  20864.       </else>
  20865.     </choose>
  20866.   </macro>
  20867.   <macro name="description-bib">
  20868.     <group delimiter=", ">
  20869.       <group delimiter=". ">
  20870.         <text macro="interviewer-bib"/>
  20871.         <text variable="medium" text-case="capitalize-first"/>
  20872.       </group>
  20873.       <choose>
  20874.         <if variable="title" match="none"> </if>
  20875.         <else-if type="thesis paper-conference" match="any"> </else-if>
  20876.         <else>
  20877.           <text variable="genre" text-case="capitalize-first"/>
  20878.         </else>
  20879.       </choose>
  20880.     </group>
  20881.   </macro>
  20882.   <macro name="container-prefix-bib">
  20883.     <choose>
  20884.       <if type="chapter">
  20885.     <text term="in" text-case="capitalize-first" suffix=" "/>
  20886.       </if>
  20887.     </choose>
  20888.   </macro>
  20889.   <macro name="locators-bib">
  20890.     <choose>
  20891.       <if type="article-journal">
  20892.         <text variable="volume" prefix=" "/>
  20893.         <text variable="issue" prefix=", no. "/>
  20894.       </if>
  20895.       <else-if type="book">
  20896.         <group prefix=". " delimiter=". ">
  20897.           <group>
  20898.             <text term="volume" form="short"  text-case="capitalize-first" suffix=". "/>
  20899.             <number variable="volume" form="numeric"/>
  20900.           </group>
  20901.           <choose>
  20902.             <if variable="locator" match="none">
  20903.           <group>
  20904.             <number variable="number-of-volumes" form="numeric"/>
  20905.             <text term="volume" form="short" prefix=" " suffix="." plural="true"/>
  20906.           </group>
  20907.             </if>
  20908.           </choose>
  20909.           <text variable="edition"/>
  20910.         </group>
  20911.       </else-if>
  20912.     </choose>
  20913.   </macro>
  20914.   <macro name="locators-newspaper">
  20915.     <choose>
  20916.       <if type="article-newspaper">
  20917.         <group delimiter=", ">
  20918.           <group>
  20919.         <text variable="edition" suffix=" "/>
  20920.         <text term="edition" prefix=" "/>
  20921.           </group>
  20922.           <group>
  20923.         <text term="section" form="short" suffix=". "/>
  20924.         <text variable="section"/>
  20925.           </group>
  20926.         </group>
  20927.       </if>
  20928.     </choose>
  20929.   </macro>
  20930.   <macro name="event">
  20931.     <group>
  20932.       <text term="presented at" suffix=" "/>
  20933.       <text variable="event"/>
  20934.     </group>
  20935.   </macro>
  20936.   <macro name="publisher">
  20937.     <group delimiter=": ">
  20938.       <text variable="publisher-place"/>
  20939.       <text variable="publisher"/>
  20940.     </group>
  20941.   </macro>
  20942.   <macro name="issued">
  20943.     <choose>
  20944.       <if type="graphic report" match="any">
  20945.     <date variable="issued">
  20946.       <date-part name="month" suffix=" "/>
  20947.       <date-part name="day" suffix=", "/>
  20948.       <date-part name="year"/>
  20949.     </date>
  20950.       </if>
  20951.       <else-if type="book chapter thesis" match="any">
  20952.     <date variable="issued">
  20953.       <date-part name="year"/>
  20954.     </date>
  20955.       </else-if>
  20956.       <else>
  20957.     <date variable="issued">
  20958.       <date-part name="month" suffix=" "/>
  20959.       <date-part name="day" suffix=", "/>
  20960.       <date-part name="year"/>
  20961.     </date>
  20962.       </else>
  20963.     </choose>
  20964.   </macro>
  20965.   <macro name="pages-chapter">
  20966.     <choose>
  20967.       <if type="chapter">
  20968.     <text variable="page" prefix=", "/>
  20969.       </if>
  20970.     </choose>
  20971.   </macro>
  20972.   <macro name="pages-article">
  20973.     <choose>
  20974.       <if type="article-journal">
  20975.     <text variable="page" prefix=": "/>
  20976.       </if>
  20977.     </choose>
  20978.   </macro>
  20979.   <macro name="archive-bib">
  20980.     <group delimiter=". ">
  20981.       <text variable="archive_location" text-case="capitalize-first"/>
  20982.       <text variable="archive"/>
  20983.       <text variable="archive-place"/>
  20984.     </group>
  20985.   </macro>
  20986.   <macro name="issue-bib">
  20987.     <choose>
  20988.       <if type="article-journal">
  20989.         <text macro="issued" prefix=" (" suffix=")"/>
  20990.       </if>
  20991.       <else-if variable="publisher-place publisher" match="any">
  20992.         <choose>
  20993.           <if variable="title" match="none"> </if>
  20994.           <else-if type="paper-conference">
  20995.             <text variable="genre" text-case="capitalize-first" prefix=". "/>
  20996.           </else-if>
  20997.         </choose>
  20998.         <text macro="event" prefix=" "/>
  20999.         <group prefix=". " delimiter=", ">
  21000.           <choose>
  21001.             <if type="thesis">
  21002.               <text variable="genre" text-case="capitalize-first"/>
  21003.             </if>
  21004.           </choose>
  21005.           <text macro="publisher"/>
  21006.           <text macro="issued"/>
  21007.         </group>
  21008.       </else-if>
  21009.       <else>
  21010.         <text macro="issued" prefix=", "/>
  21011.       </else>
  21012.     </choose>
  21013.   </macro>
  21014.   <macro name="access-bib">
  21015.     <group delimiter=". ">
  21016.       <choose>
  21017.         <if type="graphic report" match="any">
  21018.       <text macro="archive-bib"/>
  21019.         </if>
  21020.         <else-if type="book thesis chapter article-journal article-newspaper article-magazine" match="none">
  21021.       <text macro="archive-bib"/>
  21022.         </else-if>
  21023.       </choose>
  21024.       <text variable="URL"/>
  21025.     </group>
  21026.   </macro>
  21027.   <macro name="sort-key">
  21028.       <text macro="author-sort" suffix=" "/>
  21029.       <text variable="title" suffix=" "/>
  21030.       <text variable="genre"/>
  21031.   </macro>
  21032.   <citation>
  21033.     <option name="et-al-min" value="4"/>
  21034.     <option name="et-al-use-first" value="1"/>
  21035.     <option name="et-al-subsequent-min" value="4"/>
  21036.     <option name="et-al-subsequent-use-first" value="1"/>
  21037.     <option name="disambiguate-add-year-suffix" value="true"/>
  21038.     <option name="disambiguate-add-names" value="true"/>
  21039.     <option name="disambiguate-add-givenname" value="true"/>
  21040.     <layout prefix="" suffix="." delimiter="; ">
  21041.       <choose>
  21042.         <if position="ibid-with-locator">
  21043.           <group delimiter=", ">
  21044.             <text term="ibid" text-case="capitalize-first" suffix="."/>
  21045.             <text variable="locator"/>
  21046.           </group>
  21047.         </if>
  21048.         <else-if position="ibid">
  21049.           <text term="ibid" text-case="capitalize-first" suffix="."/>
  21050.         </else-if>
  21051.         <else>
  21052.           <group delimiter=", ">
  21053.             <group>
  21054.               <text macro="author-short"/>
  21055.               <text macro="recipient-short"/>
  21056.             </group>
  21057.             <text macro="title-short"/>
  21058.             <text variable="locator"/>
  21059.           </group>
  21060.         </else>
  21061.       </choose>
  21062.     </layout>
  21063.   </citation> 
  21064.   <bibliography>
  21065.     <option name="hanging-indent" value="true"/>
  21066.     <option name="et-al-min" value="6"/>
  21067.     <option name="et-al-use-first" value="6"/>
  21068.     <option name="subsequent-author-substitute" value="---"/>
  21069.     <sort>
  21070.       <key macro="sort-key"/>
  21071.     </sort>
  21072.     <layout suffix=".">
  21073.       <group delimiter=". ">
  21074.         <text macro="author-bib"/>
  21075.         <text macro="recipient-bib"/>
  21076.         <text macro="title-bib"/>
  21077.         <text macro="description-bib"/>
  21078.         <text macro="translator-article-bib"/>
  21079.         <group>
  21080.           <text macro="container-prefix-bib"/>
  21081.           <text variable="container-title" font-style="italic"/>
  21082.           <text macro="pages-chapter"/>
  21083.         </group>
  21084.         <text macro="secondary-contributor-bib"/>
  21085.       </group>
  21086.       <text macro="locators-bib"/>
  21087.       <text variable="collection-title" text-case="capitalize-first" prefix=". "/>
  21088.       <text macro="issue-bib"/>
  21089.       <text macro="locators-newspaper" prefix=", "/>
  21090.       <text macro="pages-article"/>
  21091.       <text macro="access-bib" prefix=". "/>
  21092.     </layout>
  21093.   </bibliography>
  21094. </style>
  21095. ');
  21096.  
  21097. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/chicago-note', '2008-02-02 00:00:00', 'Chicago Manual of Style (Note without Bibliography)',
  21098. '<?xml version="1.0" encoding="UTF-8"?>
  21099. <?oxygen RNGSchema="http://xbiblio.svn.sourceforge.net/viewvc/*checkout*/xbiblio/csl/schema/trunk/csl.rnc" type="compact"?>
  21100. <style xmlns="http://purl.org/net/xbiblio/csl" class="note" xml:lang="en">
  21101.   <info>
  21102.     <title>Chicago Manual of Style (Note without Bibliography)</title>
  21103.     <id>http://www.zotero.org/styles/chicago-note</id>
  21104.     <link href="http://www.zotero.org/styles/chicago-note"/>
  21105.     <link href="http://www.chicagomanualofstyle.org/tools_citationguide.html" rel="documentation"/>
  21106.     <author>
  21107.       <name>Julian Onions</name>
  21108.       <email>julian.onions@gmail.com</email>
  21109.     </author>
  21110.     <contributor>
  21111.       <name>Simon Kornblith</name>
  21112.       <email>simon@simonster.com</email>
  21113.     </contributor>
  21114.     <contributor>
  21115.       <name>Elena Razlogova</name>
  21116.       <email>elena.razlogova@gmail.com</email>
  21117.     </contributor>
  21118.     <summary>Chicago format with full notes and no bibliography</summary>
  21119.     <category term="generic-base"/>
  21120.     <category term="note"/>
  21121.     <updated>2008-02-02T00:00:00+00:00</updated>
  21122.   </info>
  21123.   <macro name="translator">
  21124.     <choose>
  21125.       <if variable="author editor" match="any">
  21126.     <names variable="translator" delimiter=", ">
  21127.       <label form="verb-short" prefix=" " text-case="lowercase" suffix=". "/>
  21128.       <name and="text" delimiter=", "/>
  21129.     </names>
  21130.       </if>
  21131.     </choose>
  21132.   </macro>
  21133.   <macro name="secondary-contributor">
  21134.     <group delimiter=", ">
  21135.       <names variable="editor" delimiter=", ">
  21136.         <label form="verb-short" prefix=" " text-case="lowercase" suffix=". "/>
  21137.         <name and="text" delimiter=", "/>
  21138.       </names>
  21139.       <choose>
  21140.         <if type="article-journal article-magazine article-newspaper" match="none">
  21141.       <text macro="translator"/>
  21142.         </if>
  21143.       </choose>
  21144.     </group>
  21145.   </macro>
  21146.   <macro name="translator-article">
  21147.     <choose>
  21148.       <if type="article-journal article-magazine article-newspaper" match="any">
  21149.         <text macro="translator"/>
  21150.       </if>
  21151.     </choose>
  21152.   </macro>
  21153.   <macro name="author">
  21154.     <names variable="author">
  21155.       <name and="text" sort-separator=", " delimiter=", "/>
  21156.       <label form="verb-short" prefix=", " suffix="."/>
  21157.       <substitute>
  21158.         <names variable="editor"/>
  21159.         <names variable="translator"/>
  21160.       </substitute>
  21161.     </names>
  21162.   </macro>
  21163.   <macro name="author-short">
  21164.     <names variable="author">
  21165.       <name form="short" and="text" delimiter=", "/>
  21166.       <label form="verb-short" prefix=", " suffix="."/>
  21167.       <substitute>
  21168.         <names variable="editor"/>
  21169.         <names variable="translator"/>
  21170.       </substitute>
  21171.     </names>
  21172.   </macro>
  21173.   <macro name="recipient">
  21174.     <names variable="recipient" delimiter=", ">
  21175.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  21176.       <name and="text" delimiter=", "/>
  21177.     </names>
  21178.   </macro>
  21179.   <macro name="recipient-short">
  21180.     <names variable="recipient">
  21181.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  21182.       <name form="short" and="text" delimiter=", "/>
  21183.     </names>
  21184.   </macro>
  21185.   <macro name="interviewer">
  21186.     <names variable="interviewer" delimiter=", ">
  21187.       <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
  21188.       <name and="text" delimiter=", "/>
  21189.     </names>
  21190.   </macro>
  21191.   <macro name="title">
  21192.     <choose>
  21193.       <if variable="title" match="none">
  21194.         <text variable="genre"/>
  21195.       </if>
  21196.       <else-if type="book">
  21197.         <text variable="title" font-style="italic"/>
  21198.       </else-if>
  21199.       <else>
  21200.         <text variable="title" quotes="true"/>
  21201.       </else>
  21202.     </choose>
  21203.   </macro>
  21204.   <macro name="title-short">
  21205.     <choose>
  21206.       <if variable="title" match="none">
  21207.         <choose>
  21208.           <if type="interview">
  21209.             <text term="interview" text-case="lowercase"/>
  21210.           </if>
  21211.           <else-if type="manuscript paper-conference" match="any">
  21212.             <text variable="genre" form="short"/>
  21213.           </else-if>
  21214.           <else-if type="personal_communication">
  21215.             <text macro="issued"/>
  21216.           </else-if>
  21217.         </choose>
  21218.       </if>
  21219.       <else-if type="book">
  21220.         <text variable="title" form="short" font-style="italic"/>
  21221.       </else-if>
  21222.       <else>
  21223.         <text variable="title" form="short" quotes="true"/>
  21224.       </else>
  21225.     </choose>
  21226.   </macro>
  21227.   <macro name="description">
  21228.     <group delimiter=", ">
  21229.       <text macro="interviewer"/>
  21230.       <text variable="medium"/>
  21231.       <choose>
  21232.         <if variable="title" match="none"> </if>
  21233.         <else-if type="thesis paper-conference" match="any"> </else-if>
  21234.         <else>
  21235.           <text variable="genre"/>
  21236.         </else>
  21237.       </choose>
  21238.     </group>
  21239.   </macro>
  21240.   <macro name="container-prefix">
  21241.     <choose>
  21242.       <if type="chapter">
  21243.     <text term="in" text-case="lowercase" suffix=" "/>
  21244.       </if>
  21245.     </choose>
  21246.   </macro>
  21247.   <macro name="locators">
  21248.     <choose>
  21249.       <if type="article-journal">
  21250.         <text variable="volume" prefix=" "/>
  21251.         <text variable="issue" prefix=", no. "/>
  21252.       </if>
  21253.       <else-if type="book">
  21254.         <group prefix=", " delimiter=", ">
  21255.           <group>
  21256.             <text term="volume" form="short" suffix=". "/>
  21257.             <number variable="volume" form="numeric"/>
  21258.           </group>
  21259.           <choose>
  21260.             <if variable="locator" match="none">
  21261.           <group>
  21262.             <number variable="number-of-volumes" form="numeric"/>
  21263.             <text term="volume" form="short" prefix=" " suffix="." plural="true"/>
  21264.           </group>
  21265.             </if>
  21266.           </choose>
  21267.           <text variable="edition"/>
  21268.         </group>
  21269.       </else-if>
  21270.     </choose>
  21271.   </macro>
  21272.   <macro name="locators-newspaper">
  21273.     <choose>
  21274.       <if type="article-newspaper">
  21275.         <group delimiter=", ">
  21276.           <group>
  21277.         <text variable="edition" suffix=" "/>
  21278.         <text term="edition" prefix=" "/>
  21279.           </group>
  21280.           <group>
  21281.         <text term="section" form="short" suffix=". "/>
  21282.         <text variable="section"/>
  21283.           </group>
  21284.         </group>
  21285.       </if>
  21286.     </choose>
  21287.   </macro>
  21288.   <macro name="event">
  21289.     <group>
  21290.       <text term="presented at" suffix=" "/>
  21291.       <text variable="event"/>
  21292.     </group>
  21293.   </macro>
  21294.   <macro name="publisher">
  21295.     <group delimiter=": ">
  21296.       <text variable="publisher-place"/>
  21297.       <text variable="publisher"/>
  21298.     </group>
  21299.   </macro>
  21300.   <macro name="issued">
  21301.     <choose>
  21302.       <if type="graphic report" match="any">
  21303.         <date variable="issued">
  21304.           <date-part name="month" suffix=" "/>
  21305.           <date-part name="day" suffix=", "/>
  21306.           <date-part name="year"/>
  21307.         </date>
  21308.       </if>
  21309.       <else-if type="book chapter thesis" match="any">
  21310.         <date variable="issued">
  21311.           <date-part name="year"/>
  21312.         </date>
  21313.       </else-if>
  21314.       <else>
  21315.         <date variable="issued">
  21316.           <date-part name="month" suffix=" "/>
  21317.           <date-part name="day" suffix=", "/>
  21318.           <date-part name="year"/>
  21319.         </date>
  21320.       </else>
  21321.     </choose>
  21322.   </macro>
  21323.   <macro name="pages">
  21324.     <choose>
  21325.       <if type="article-journal">
  21326.     <text variable="page" prefix=": "/>
  21327.       </if>
  21328.       <else-if type="chapter">
  21329.     <text variable="page" prefix=", "/>
  21330.       </else-if>
  21331.     </choose>
  21332.   </macro>
  21333.   <macro name="locator">
  21334.     <choose>
  21335.       <if variable="locator" match="none">
  21336.         <text macro="pages"/>
  21337.       </if>
  21338.       <else-if type="article-journal">
  21339.         <text variable="locator" prefix=": "/>
  21340.       </else-if>
  21341.       <else>
  21342.         <text variable="locator" prefix=", "/>
  21343.       </else>
  21344.     </choose>
  21345.   </macro>
  21346.   <macro name="archive">
  21347.     <group delimiter=", ">
  21348.       <text variable="archive_location"/>
  21349.       <text variable="archive"/>
  21350.       <text variable="archive-place"/>
  21351.     </group>
  21352.   </macro>
  21353.   <macro name="issue">
  21354.     <choose>
  21355.       <if type="article-journal">
  21356.         <text macro="issued" prefix=" (" suffix=")"/>
  21357.       </if>
  21358.       <else-if variable="publisher-place publisher" match="any">
  21359.         <group prefix=" (" suffix=")" delimiter=", ">
  21360.           <group delimiter=" ">
  21361.             <choose>
  21362.               <if variable="title" match="none"> </if>
  21363.               <else-if type="thesis paper-conference" match="any">
  21364.                 <text variable="genre"/>
  21365.               </else-if>
  21366.             </choose>
  21367.             <text macro="event"/>
  21368.           </group>
  21369.           <text macro="publisher"/>
  21370.           <text macro="issued"/>
  21371.         </group>
  21372.       </else-if>
  21373.       <else>
  21374.         <text macro="issued" prefix=", "/>
  21375.       </else>
  21376.     </choose>
  21377.   </macro>
  21378.   <macro name="access">
  21379.     <group delimiter=", ">
  21380.       <choose>
  21381.         <if type="graphic report" match="any">
  21382.       <text macro="archive"/>
  21383.         </if>
  21384.         <else-if type="book thesis chapter article-journal article-newspaper article-magazine" match="none">
  21385.       <text macro="archive"/>
  21386.         </else-if>
  21387.       </choose>
  21388.       <text variable="URL"/>
  21389.     </group>
  21390.   </macro>
  21391.   <citation>
  21392.     <option name="et-al-min" value="4"/>
  21393.     <option name="et-al-use-first" value="1"/>
  21394.     <option name="et-al-subsequent-min" value="4"/>
  21395.     <option name="et-al-subsequent-use-first" value="1"/>
  21396.     <option name="disambiguate-add-year-suffix" value="true"/>
  21397.     <option name="disambiguate-add-names" value="true"/>
  21398.     <option name="disambiguate-add-givenname" value="true"/>
  21399.     <layout prefix="" suffix="." delimiter="; ">
  21400.       <choose>
  21401.         <if position="ibid-with-locator">
  21402.           <group delimiter=", ">
  21403.             <text term="ibid" text-case="capitalize-first" suffix="."/>
  21404.             <text variable="locator"/>
  21405.           </group>
  21406.         </if>
  21407.         <else-if position="ibid">
  21408.           <text term="ibid" text-case="capitalize-first" suffix="."/>
  21409.         </else-if>
  21410.         <else-if position="subsequent">
  21411.           <group delimiter=", ">
  21412.             <group>
  21413.               <text macro="author-short"/>
  21414.               <text macro="recipient-short"/>
  21415.             </group>
  21416.             <text macro="title-short"/>
  21417.             <text variable="locator"/>
  21418.           </group>
  21419.         </else-if>
  21420.         <else>
  21421.           <group delimiter=", ">
  21422.             <group>
  21423.               <text macro="author"/>
  21424.               <text macro="recipient"/>
  21425.             </group>
  21426.             <text macro="title"/>
  21427.             <text macro="description"/>
  21428.             <text macro="translator-article"/>
  21429.             <group>
  21430.               <text macro="container-prefix"/>
  21431.               <text variable="container-title" font-style="italic"/>
  21432.             </group>
  21433.             <text macro="secondary-contributor"/>
  21434.           </group>
  21435.           <text macro="locators"/>
  21436.           <text variable="collection-title" prefix=", "/>
  21437.           <text macro="issue"/>
  21438.           <text macro="locators-newspaper" prefix=", "/>
  21439.           <text macro="locator"/>
  21440.           <text macro="access" prefix=", "/>
  21441.         </else>
  21442.       </choose>
  21443.     </layout>
  21444.   </citation>
  21445. </style>
  21446. ');
  21447.  
  21448. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/ieee', '2008-02-02 00:00:00', 'IEEE',
  21449. '<?xml version="1.0" encoding="UTF-8"?>
  21450. <?oxygen RNGSchema="http://xbiblio.svn.sourceforge.net/viewvc/*checkout*/xbiblio/csl/schema/trunk/csl.rnc" type="compact"?>
  21451. <style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" xml:lang="en">
  21452.   <info>
  21453.     <title>IEEE</title>
  21454.     <id>http://www.zotero.org/styles/ieee</id>
  21455.     <link href="http://www.zotero.org/styles/ieee"/>
  21456.     <author>
  21457.       <name>Michael Berkowitz</name>
  21458.       <email>mberkowi@gmu.edu</email>
  21459.     </author>
  21460.     <contributor>
  21461.       <name>Julian Onions</name>
  21462.       <email>julian.onions@gmail.com</email>
  21463.     </contributor>
  21464.     <category term="engineering"/>
  21465.     <category term="generic-base"/>
  21466.     <category term="numeric"/>
  21467.     <updated>2008-02-02T00:00:00+00:00</updated>
  21468.   </info>
  21469.   <macro name="author">
  21470.     <names variable="author">
  21471.       <name initialize-with="." delimiter=", " and="text" name-as-sort-order="all"/>
  21472.       <label form="short" prefix=", " text-case="lowercase" suffix="."/>
  21473.       <substitute>
  21474.     <names variable="editor"/>
  21475.     <names variable="translator"/>
  21476.       </substitute>
  21477.     </names>
  21478.   </macro>
  21479.   <macro name="editor">
  21480.     <names variable="editor">
  21481.       <name initialize-with="." delimiter=", " and="text" name-as-sort-order="all"/>
  21482.       <label form="short" prefix=", " text-case="lowercase" suffix="."/>
  21483.     </names>
  21484.   </macro>
  21485.   <macro name="title">
  21486.     <choose>
  21487.       <if type="book">
  21488.     <text variable="title" font-style="italic"/>
  21489.       </if>
  21490.       <else>
  21491.     <text variable="title" quotes="true"/>
  21492.       </else>
  21493.     </choose>
  21494.   </macro>
  21495.   <macro name="publisher">
  21496.     <text variable="publisher-place" suffix=": " prefix=" "/>
  21497.     <text variable="publisher" suffix=", "/>
  21498.     <date variable="issued">
  21499.       <date-part name="year"/>
  21500.     </date>
  21501.   </macro>
  21502.   <macro name="access">
  21503.       <text variable="URL"/>
  21504.   </macro>
  21505.   <macro name="page">
  21506.     <group> 
  21507.       <label variable="page" form="short" suffix=". "/>
  21508.       <text variable="page" />
  21509.     </group>
  21510.   </macro>
  21511.   <citation>
  21512.     <option name="collapse" value="citation-number"/>
  21513.     <sort>
  21514.       <key variable="citation-number"/>
  21515.     </sort>
  21516.     <layout prefix="[" suffix="]" delimiter=",">
  21517.       <text variable="citation-number"/>
  21518.     </layout>
  21519.   </citation>
  21520.   <bibliography>
  21521.     <option name="et-al-min" value="4"/>
  21522.     <option name="et-al-use-first" value="1"/>
  21523.     <option name="second-field-align" value="margin"/>
  21524.     <layout suffix=".">
  21525.       <text variable="citation-number" prefix="[" suffix="]"/>
  21526.       <text macro="author" prefix=" " suffix=", "/>
  21527.       <choose>
  21528.     <if type="book">
  21529.       <group delimiter=", ">
  21530.         <text macro="title"/>
  21531.         <text macro="publisher"/>
  21532.       </group>
  21533.     </if>
  21534.     <else-if type="chapter">
  21535.       <group delimiter=", "> 
  21536.         <text macro="title"/>
  21537.         <text variable="container-title" font-style="italic"/>
  21538.         <text macro="editor"/>
  21539.         <text macro="publisher" />
  21540.         <text macro="page"/>
  21541.       </group>
  21542.     </else-if>
  21543.     <else>
  21544.       <group delimiter=", "> 
  21545.         <text macro="title"/>
  21546.         <text variable="container-title" font-style="italic"/>
  21547.         <text variable="volume" prefix=" vol. " />
  21548.         <date variable="issued" >
  21549.           <date-part name="month" form="short" suffix=". "/>
  21550.           <date-part name="year"/>
  21551.         </date>
  21552.         <text macro="page"/>
  21553.       </group>
  21554.     </else>
  21555.       </choose>
  21556.       <text macro="access" prefix="; "/>
  21557.     </layout>
  21558.   </bibliography>
  21559. </style>
  21560. ');
  21561.  
  21562. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/harvard1', '2008-02-02 00:00:00', 'Harvard Reference format 1 (Author-Date)',
  21563. '<?xml version="1.0" encoding="UTF-8"?>
  21564. <style xmlns="http://purl.org/net/xbiblio/csl" xml:lang="en" class="in-text" >
  21565.   <info>
  21566.     <title>Harvard Reference format 1 (Author-Date)</title>
  21567.     <id>http://www.zotero.org/styles/harvard1</id>
  21568.     <link href="http://www.zotero.org/styles/harvard1"/>
  21569.     <author>
  21570.       <name>Julian Onions</name>
  21571.       <email>julian.onions@gmail.com</email>
  21572.     </author>
  21573.     <category term="author-date"/>
  21574.     <category term="generic-base"/>
  21575.     <updated>2008-02-02T00:00:00+00:00</updated>
  21576.     <summary>The Harvard author-date style</summary>
  21577.     <link href="http://libweb.anglia.ac.uk/referencing/harvard.htm" rel="documentation"/>
  21578.   </info>
  21579.   <macro name="editor">
  21580.     <names variable="editor" delimiter=", ">
  21581.       <name and="symbol" initialize-with=". " delimiter=", "/>
  21582.       <label form="short" prefix=", " text-case="lowercase" suffix="."/>
  21583.     </names>
  21584.   </macro>
  21585.   <macro name="anon">
  21586.     <text term="anonymous" form="short" text-case="capitalize-first"/>
  21587.   </macro>
  21588.   <macro name="author">
  21589.     <names variable="author">
  21590.       <name name-as-sort-order="all" and="symbol" sort-separator=", " initialize-with="."
  21591.         delimiter-precedes-last="never" delimiter=", "/>
  21592.       <label form="short" prefix=" " suffix="." text-case="lowercase"/>
  21593.       <substitute>
  21594.     <names variable="editor"/>
  21595.     <text macro="anon"/>
  21596.       </substitute>
  21597.     </names>
  21598.   </macro>
  21599.   <macro name="author-short">
  21600.     <names variable="author">
  21601.       <name form="short" and="symbol" delimiter=", " delimiter-precedes-last="never" initialize-with=". "/>
  21602.       <substitute>
  21603.     <names variable="editor"/>
  21604.     <names variable="translator"/>
  21605.     <text macro="anon"/>
  21606.       </substitute>
  21607.     </names>
  21608.   </macro>
  21609.   <macro name="access">
  21610.     <group>
  21611.       <text value="Available at:" suffix=" "/>
  21612.       <text variable="URL"/>
  21613.       <group prefix=" [" suffix="]">
  21614.     <text term="accessed" text-case="capitalize-first" suffix=" "/>
  21615.     <date variable="accessed">
  21616.       <date-part name="month" suffix=" "/>
  21617.       <date-part name="day" suffix=", "/>
  21618.       <date-part name="year"/>
  21619.     </date>
  21620.       </group>
  21621.     </group>
  21622.   </macro>
  21623.   <macro name="title">
  21624.     <choose>
  21625.       <if type="book">
  21626.     <text variable="title" font-style="italic"/>
  21627.       </if>
  21628.       <else>
  21629.     <text variable="title"/>
  21630.       </else>
  21631.     </choose>
  21632.   </macro>
  21633.   <macro name="publisher">
  21634.     <group delimiter=": ">
  21635.       <text variable="publisher-place"/>
  21636.       <text variable="publisher"/>
  21637.     </group>
  21638.   </macro>
  21639.   <macro name="year-date">
  21640.     <choose>
  21641.       <if variable="issued">
  21642.     <date variable="issued">
  21643.       <date-part name="year"/>
  21644.     </date>
  21645.       </if>
  21646.       <else>
  21647.       <text term="no date"/>
  21648.       </else>
  21649.     </choose>
  21650.   </macro>
  21651.   <macro name="edition">
  21652.     <choose>
  21653.       <if is-numeric="edition">
  21654.     <group delimiter=" ">
  21655.       <number variable="edition" form="ordinal"/>
  21656.       <text term="edition" form="short" suffix="."/>
  21657.     </group>
  21658.       </if>
  21659.       <else>
  21660.       <text variable="edition" suffix="."/>
  21661.       </else>
  21662.     </choose>
  21663.   </macro>
  21664.   <citation>
  21665.     <option name="et-al-min" value="4"/>
  21666.     <option name="et-al-use-first" value="1"/>
  21667.     <option name="et-al-subsequent-min" value="6"/>
  21668.     <option name="et-al-subsequent-use-first" value="1"/>
  21669.     <option name="disambiguate-add-year-suffix" value="true"/>
  21670.     <option name="disambiguate-add-names" value="true"/>
  21671.     <option name="disambiguate-add-givenname" value="true"/>
  21672.     <option name="collapse" value="year"/>
  21673.     <layout prefix="(" suffix=")" delimiter="; ">
  21674.       <group delimiter=", ">
  21675.     <group delimiter=" ">
  21676.       <text macro="author-short"/>
  21677.       <text macro="year-date"/>
  21678.     </group>
  21679.     <text variable="locator" prefix="p."/>
  21680.       </group>
  21681.     </layout>
  21682.   </citation>
  21683.   <bibliography>
  21684.     <option name="hanging-indent" value="true"/>
  21685.     <option name="et-al-min" value="4"/>
  21686.     <option name="et-al-use-first" value="1"/>
  21687.     <sort>
  21688.       <key macro="author"/>
  21689.       <key variable="title"/>
  21690.     </sort>
  21691.     <layout>
  21692.       <text macro="author" suffix=","/>
  21693.       <date variable="issued" prefix=" " suffix=".">
  21694.     <date-part name="year"/>
  21695.       </date>
  21696.       <choose>
  21697.     <if type="book">
  21698.       <group prefix=" " delimiter=" " suffix=",">
  21699.         <text macro="title" />
  21700.         <text macro="edition"/>
  21701.         <text macro="editor"/>
  21702.       </group>
  21703.       <text prefix=" " suffix="." macro="publisher"/>
  21704.     </if>
  21705.     <else-if type="chapter">
  21706.       <text macro="title" prefix=" " suffix="."/>
  21707.       <group class="container" prefix=" ">
  21708.         <text term="in" text-case="capitalize-first"/>
  21709.         <text macro="editor" prefix=" "/>
  21710.         <text variable="container-title" font-style="italic" prefix=" " suffix="."/>
  21711.         <text variable="collection-title" prefix=" " suffix="."/>
  21712.         <group suffix=".">
  21713.           <text macro="publisher" prefix=" "/>
  21714.           <group prefix=", ">
  21715.         <text variable="page" prefix="p. "/>
  21716.           </group>
  21717.         </group>
  21718.       </group>
  21719.     </else-if>
  21720.     <else>
  21721.       <group suffix=".">
  21722.         <text macro="title" prefix=" " />
  21723.         <text macro="editor" prefix=" "/>
  21724.       </group>
  21725.       <group class="container" prefix=" " suffix=".">
  21726.         <text variable="container-title" font-style="italic"/>
  21727.         <group prefix=", ">
  21728.           <text variable="volume" />
  21729.           <text variable="issue" prefix="(" suffix=")"/>
  21730.         </group>
  21731.         <group prefix=", ">
  21732.           <text variable="page" prefix="p."/>
  21733.         </group>
  21734.       </group>
  21735.     </else>
  21736.       </choose>
  21737.       <text prefix=" " macro="access" suffix="."/>
  21738.     </layout>
  21739.   </bibliography>
  21740. </style>
  21741. ');
  21742.  
  21743. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/mhra', '2008-02-02 00:00:00', 'Modern Humanities Research Association (Note with Bibliography)',
  21744. '<style xmlns="http://purl.org/net/xbiblio/csl" class="note" xml:lang="en"> 
  21745.   <info>
  21746.     <title>Modern Humanities Research Association (Note with Bibliography)</title>
  21747.     <id>http://www.zotero.org/styles/mhra</id>
  21748.     <link href="http://www.zotero.org/styles/mhra"/>
  21749.     <link href="http://www.mhra.org.uk/Publications/Books/StyleGuide/download.shtml" rel="documentation"/>
  21750.     <author>
  21751.       <name>Julian Onions</name>
  21752.       <email>julian.onions@gmail.com</email>
  21753.     </author>
  21754.     <category term="history"/>
  21755.     <category term="numeric"/>
  21756.     <category term="generic-base"/>
  21757.     <updated>2008-02-02T00:00:00+00:00</updated>
  21758.   </info>
  21759.   <macro name="editor-translator">
  21760.     <names variable="editor translator" prefix="" suffix="" delimiter=", ">
  21761.       <label form="verb-short" prefix=" " text-case="lowercase" suffix=" "/>
  21762.       <name and="text" delimiter=", "/>
  21763.     </names>
  21764.   </macro>
  21765.   <macro name="editor-translator-short">
  21766.     <names variable="editor translator" prefix="" suffix="" delimiter=", ">
  21767.       <label form="short" prefix=" " text-case="lowercase" suffix=". "/>
  21768.       <name and="text" delimiter=", "/>
  21769.     </names>
  21770.   </macro>
  21771.   <macro name="author">
  21772.     <names variable="author">
  21773.       <name name-as-sort-order="first" and="text" sort-separator=", "
  21774.         delimiter=", " delimiter-precedes-last="always"/>
  21775.       <label form="short" prefix=", " suffix="."/>
  21776.       <substitute>
  21777.     <names variable="editor"/>
  21778.     <names variable="translator"/>
  21779.     <text macro="title"/>
  21780.       </substitute>
  21781.     </names>
  21782.   </macro> 
  21783.   <macro name="author-full">
  21784.     <names variable="author">
  21785.       <name name-as-sort-order="all" and="text" sort-separator=", "
  21786.         delimiter=", " delimiter-precedes-last="always"/>
  21787.       <label form="short" prefix=", " suffix="."/>
  21788.       <substitute>
  21789.     <names variable="editor"/>
  21790.     <names variable="translator"/>
  21791.     <text macro="title"/>
  21792.       </substitute>
  21793.     </names>
  21794.   </macro>
  21795.   <macro name="author-short">
  21796.     <names variable="author">
  21797.       <name form="long" and="text" delimiter=", " />
  21798.       <label form="short" prefix=", " suffix="."/>
  21799.     </names>
  21800.   </macro>
  21801.   <macro name="access">
  21802.     <group>
  21803.       <text variable="URL"/>
  21804.       <group prefix=" (" suffix=")" delimiter=" ">
  21805.     <text term="accessed" text-case="lowercase" suffix=" "/>
  21806.     <date variable="accessed" suffix=", ">
  21807.       <date-part name="month" suffix=" "/>
  21808.       <date-part name="day" suffix=", "/>
  21809.       <date-part name="year"/>
  21810.     </date>
  21811.       </group>
  21812.     </group>
  21813.   </macro>
  21814.   <macro name="title">
  21815.     <choose>
  21816.       <if type="thesis">
  21817.     <text variable="title" form="long" quotes="true"/>
  21818.       </if>
  21819.       <else-if type="book">
  21820.     <text variable="title" form="long" font-style="italic"/>
  21821.       </else-if>
  21822.       <else>
  21823.     <text variable="title" form="long" quotes="true"/>
  21824.       </else>
  21825.     </choose>
  21826.   </macro>
  21827.   <macro name="publisher">
  21828.     <group delimiter=": ">
  21829.       <text variable="publisher-place"/>
  21830.       <text variable="publisher"/>
  21831.     </group>
  21832.   </macro>
  21833.   <macro name="pages">
  21834.     <choose>
  21835.       <if type="article-journal" match="none">
  21836.     <label variable="page" form="short" suffix=". "/>
  21837.       </if>
  21838.     </choose>
  21839.     <text variable="page"/>
  21840.   </macro>
  21841.   <macro name="locator">
  21842.     <label variable="locator" form="short" suffix=". "/>
  21843.     <text variable="locator"/>
  21844.   </macro>
  21845.   <macro name="vols">
  21846.     <choose>
  21847.       <if variable="number-of-volumes">
  21848.     <text variable="number-of-volumes"/>
  21849.     <text term="volume" prefix=" " form="short" plural="true"/>
  21850.       </if>
  21851.     </choose>
  21852.   </macro>
  21853.   <citation>
  21854.     <layout suffix="." delimiter="; ">
  21855.       <group suffix="">       
  21856.     <text macro="author-short" suffix=", "/>
  21857.     <text macro="title" prefix=""/>
  21858.     <choose>
  21859.       <if type="thesis">
  21860.         <group prefix=" (" delimiter=", " suffix=")">
  21861.           <text variable="genre"/>
  21862.           <text variable="publisher"/>
  21863.           <date variable="issued">
  21864.         <date-part name="year"/>
  21865.           </date>
  21866.         </group>
  21867.       </if>
  21868.       <else-if type="chapter">
  21869.         <group class="container" prefix=", ">
  21870.           <text term="in" text-case="lowercase"/>
  21871.           <text variable="container-title" font-style="italic" prefix=" " suffix=","/>
  21872.           <text variable="collection-title" prefix=" " suffix=","/>
  21873.           <text macro="editor-translator-short"/>
  21874.         </group>
  21875.         <group prefix=" (" suffix=")" delimiter=", ">
  21876.           <text macro="publisher" />
  21877.           <date variable="issued">
  21878.         <date-part name="year"/>
  21879.           </date>
  21880.         </group>
  21881.       </else-if>
  21882.       <else-if type="book">
  21883.         <group delimiter=", " prefix=" ">
  21884.           <text macro="editor-translator-short"/>
  21885.           <text variable="collection-title"/>
  21886.           <text variable="edition" suffix=" edn"/>
  21887.           <text macro="vols"/>
  21888.         </group>
  21889.         <group prefix=" (" suffix=")" delimiter=", ">
  21890.           <text macro="publisher"/>
  21891.           <date variable="issued" prefix=" " suffix="">
  21892.         <date-part name="year"/>
  21893.           </date>
  21894.         </group>
  21895.         <text variable="volume" prefix=", "/>
  21896.       </else-if>
  21897.       <else-if type="article-newspaper article-magazine" match="any">
  21898.         <group delimiter=", " prefix=", ">
  21899.           <text variable="container-title" font-style="italic"/>
  21900.           <text variable="issue"  suffix="."/>
  21901.           <date variable="issued">
  21902.         <date-part name="day" form="numeric" suffix=" "/>
  21903.         <date-part name="month" form="long" suffix=" "/>
  21904.         <date-part name="year"/>
  21905.           </date>          
  21906.         </group>
  21907.       </else-if>
  21908.       <else-if type="article-journal">
  21909.         <group class="container" prefix=", " delimiter=", ">
  21910.           <text variable="container-title" font-style="italic"/>
  21911.           <text macro="publisher"/>
  21912.           <text variable="volume"  prefix=" "/>
  21913.         </group>
  21914.         <date variable="issued" prefix=" (" suffix=")">
  21915.           <date-part name="year"/>
  21916.         </date>
  21917.       </else-if>
  21918.       <else>
  21919.         <group delimiter=", " prefix=". ">
  21920.           <text variable="container-title" font-style="italic"/>
  21921.           <text variable="issue"  prefix=", " suffix="."/>
  21922.           <date variable="issued">
  21923.         <date-part name="month" form="long"/>
  21924.         <date-part name="day" form="numeric" prefix=" " suffix=", "/>
  21925.         <date-part name="year"/>
  21926.           </date>          
  21927.         </group>
  21928.       </else>
  21929.     </choose>
  21930.     <group prefix=", " delimiter=" ">
  21931.       <text macro="pages"/>
  21932.       <text macro="locator" prefix="(" suffix=")"/>
  21933.     </group>
  21934.       </group> 
  21935.     </layout>
  21936.   </citation> 
  21937.   <bibliography>
  21938.     <option name="hanging-indent" value="true"/>
  21939.     <option name="et-al-min" value="6"/>
  21940.     <option name="et-al-use-first" value="6"/>
  21941.     <option name="subsequent-author-substitute" value="---"/>
  21942.     <sort>
  21943.       <key macro="author"/>
  21944.       <key variable="title"/>
  21945.     </sort>
  21946.     <layout suffix=".">
  21947.       <text macro="author" suffix=","/>
  21948.       <choose>
  21949.     <if type="thesis">
  21950.       <group suffix=".">
  21951.         <text macro="title" prefix=" "/>
  21952.       </group>
  21953.       <group delimiter=", " prefix=" ">
  21954.         <text variable="genre"/>
  21955.         <text variable="publisher"/>
  21956.         <date variable="issued">
  21957.           <date-part name="year"/>
  21958.         </date>
  21959.       </group>
  21960.     </if>
  21961.     <else-if type="chapter">
  21962.       <text macro="title" prefix=" "/>
  21963.       <group class="container" prefix=", ">
  21964.         <text term="in" text-case="lowercase"/>
  21965.         <text variable="container-title" font-style="italic" prefix=" " suffix=","/>
  21966.         <text variable="collection-title" prefix=" " suffix=","/>
  21967.         <text macro="editor-translator-short"/>
  21968.       </group>
  21969.       <group prefix=" (" suffix=")" delimiter=", ">
  21970.         <text macro="publisher" />
  21971.         <date variable="issued">
  21972.           <date-part name="year"/>
  21973.         </date>
  21974.       </group>
  21975.     </else-if>
  21976.     <else-if type="article-journal">
  21977.       <group suffix=".">
  21978.         <text macro="title" prefix=" "/>
  21979.         <text macro="editor-translator" prefix=" "/>
  21980.       </group>
  21981.       <group class="container" prefix=" " suffix="">
  21982.         <text variable="container-title" font-style="italic" prefix=" "/>
  21983.         <text variable="volume"  prefix=" "/>
  21984.         <text variable="issue" prefix=", no. "/>
  21985.         <date variable="issued" prefix=" (" suffix=")">
  21986.           <date-part name="month" suffix=" "/>
  21987.           <date-part name="day" suffix=", "/>
  21988.           <date-part name="year"/>
  21989.         </date>
  21990.         <text variable="page" prefix=": "/>
  21991.       </group>
  21992.     </else-if>
  21993.     <else-if type="article-newspaper article-magazine" match="any">
  21994.       <group suffix=".">
  21995.         <text macro="title" prefix=" "/>
  21996.         <text macro="editor-translator" prefix=" "/>
  21997.       </group>
  21998.       <group delimiter=", " prefix=" ">
  21999.         <text variable="container-title" font-style="italic"/>
  22000.         <text variable="issue"  suffix="."/>
  22001.         <date variable="issued">
  22002.           <date-part name="month" form="long"/>
  22003.           <date-part name="day" form="numeric" prefix=" " suffix=", "/>
  22004.           <date-part name="year"/>
  22005.         </date>          
  22006.       </group>
  22007.     </else-if>
  22008.     <else-if type="paper-conference">
  22009.       <group suffix=".">
  22010.         <text macro="title" prefix=" "/>
  22011.         <text macro="editor-translator" prefix=" "/>
  22012.       </group>
  22013.       <group suffix="">
  22014.         <text value="paper presented at" text-case="capitalize-first"/>
  22015.         <text variable="event" prefix=" "/>
  22016.         <text variable="event-place"  prefix=", "/>
  22017.         <date variable="event">
  22018.           <date-part name="month" form="long"/>
  22019.           <date-part name="day" form="numeric" prefix=" " suffix=", "/>
  22020.           <date-part name="year"/>
  22021.         </date>          
  22022.       </group>
  22023.     </else-if>
  22024.     <else-if type="book">
  22025.       <group suffix=".">
  22026.         <text macro="title" prefix=" " suffix="."/>
  22027.       </group>
  22028.       <group delimiter=", " prefix=" ">
  22029.         <text macro="editor-translator-short"/>
  22030.         <text variable="collection-title"/>
  22031.         <text variable="edition" suffix=" edn"/>
  22032.         <text macro="vols"/>
  22033.       </group>
  22034.       <group prefix=" (" suffix=")" delimiter=", ">
  22035.         <text macro="publisher"/>
  22036.         <date variable="issued" prefix=" " suffix="">
  22037.           <date-part name="year"/>
  22038.         </date>
  22039.       </group>
  22040.       <text variable="volume" prefix=", "/>
  22041.     </else-if>
  22042.     <else>
  22043.       <group suffix=".">
  22044.         <text macro="title" prefix=" "/>
  22045.         <text macro="editor-translator" prefix=" "/>
  22046.       </group>
  22047.       <group class="container" prefix=" " suffix="">
  22048.         <text variable="container-title" font-style="italic"/>
  22049.         <group prefix=", ">
  22050.           <text variable="volume" font-style="italic"/>
  22051.           <text variable="issue" prefix="(" suffix=")"/>
  22052.         </group>
  22053.         <text variable="page" prefix=", "/>
  22054.       </group>
  22055.     </else>
  22056.       </choose>
  22057.       <text prefix=" " macro="access"/>
  22058.     </layout>
  22059.   </bibliography>
  22060. </style>
  22061. ');
  22062.  
  22063. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/mhra_note_without_bibliography', '2008-02-02 00:00:00', 'Modern Humanities Research Association (Note without Bibliography)',
  22064. '<?xml version="1.0" encoding="UTF-8"?>
  22065. <?oxygen RNGSchema="csl.rnc" type="compact"?>
  22066. <style xmlns="http://purl.org/net/xbiblio/csl" class="note">
  22067.     <info>
  22068.         <title>Modern Humanities Research Association (Note without Bibliography)</title>
  22069.         <id>http://www.zotero.org/styles/mhra_note_without_bibliography</id>
  22070.         <link href="http://www.zotero.org/styles/mhra_note_without_bibliography"/>
  22071.         <summary>Bibliography style for the Modern Humanities Research Association</summary>
  22072.         <author>
  22073.             <name>Jim Safley</name>
  22074.             <email>jsafley@gmu.edu</email>
  22075.         </author>
  22076.         <updated>2008-02-02T00:00:00+00:00</updated>
  22077.     </info>
  22078.     <defaults>
  22079.         <et-al min-authors="4" use-first="1" term-name="and-others"></et-al>
  22080.         <author name-as-sort-order="no">
  22081.             <name and="text" delimiter=", " delimiter-precedes-last="always"></name>
  22082.             <substitute>
  22083.                 <choose>
  22084.                     <editor></editor>
  22085.                     <translator></translator>
  22086.                     <titles></titles>
  22087.                 </choose>
  22088.             </substitute>
  22089.         </author>
  22090.         <contributor name-as-sort-order="no">
  22091.             <label suffix=" " form="verb"></label>
  22092.             <name and="text" delimiter=", "></name>
  22093.         </contributor>
  22094.         <locator>
  22095.             <number></number>
  22096.         </locator>
  22097.         <pages>
  22098.             <label suffix=". " form="short" ></label>
  22099.             <number></number>
  22100.         </pages>
  22101.         <identifier>
  22102.             <number></number>
  22103.         </identifier>
  22104.         <titles>
  22105.             <title></title>
  22106.         </titles>
  22107.         <date>
  22108.             <year></year>
  22109.         </date>
  22110.         <publisher>
  22111.             <place suffix=": "></place>
  22112.             <name></name>
  22113.         </publisher>
  22114.         <access>
  22115.             <url prefix=" <" suffix="> "></url>
  22116.             <text prefix=" [" suffix=" " term-name="accessed"></text>
  22117.             <date suffix="]">
  22118.                 <day suffix=" "></day>
  22119.                 <month suffix=" " text-case="capitalize-first"></month>
  22120.                 <year></year>
  22121.             </date>
  22122.         </access>
  22123.     </defaults>
  22124.     <citation suffix="." delimiter="; ">
  22125.         <layout>
  22126.             <item>
  22127.                 <choose>
  22128.                     <type name="book">
  22129.                         <author></author>
  22130.                         <titles prefix=", " font-style="italic"></titles>
  22131.                         <editor prefix=", "></editor>
  22132.                         <translator prefix=", "></translator>
  22133.                         <titles prefix=" " relation="collection"></titles><!-- this line should print out Zoteros "Series", but it does not -->
  22134.                         <!-- this line should be Zoteros "Series Number", what CSL element matches it? -->
  22135.                         <edition prefix=", "></edition>
  22136.                         <text prefix=" " term-name="edn"></text>
  22137.                         <!-- this line should be Zoteros "# of Volumes", what CSL element matches it? -->
  22138.                         <group prefix=" (" suffix=")">
  22139.                             <publisher></publisher>
  22140.                             <date prefix=", ">
  22141.                                 <year></year>
  22142.                             </date>
  22143.                         </group>
  22144.                         <volume prefix=", "></volume>
  22145.                         <access prefix=" "></access>
  22146.                     </type>
  22147.                     <type name="chapter">
  22148.                         <author></author>
  22149.                         <titles prefix=", " font-style="italic"></titles>
  22150.                         <text prefix=", " term-name="in"></text>
  22151.                         <titles prefix=" " relation="container" font-style="italic"/>
  22152.                         <editor prefix=", "></editor>
  22153.                         <translator prefix=", "></translator>
  22154.                         <titles prefix=" " relation="collection"></titles><!-- this line should print out Zoteros "Series", but it does not -->
  22155.                         <!-- this line should be Zoteros "Series Number", what CSL element matches it? -->
  22156.                         <edition prefix=", "></edition>
  22157.                         <text prefix=" " term-name="edn"></text> <!-- this line should print out "edn" -->
  22158.                         <!-- this line should be Zoteros "# of Volumes", what CSL element matches it? -->
  22159.                         <group prefix=" (" suffix=")">
  22160.                             <publisher></publisher>
  22161.                             <date prefix=", ">
  22162.                                 <year></year>
  22163.                             </date>
  22164.                         </group>
  22165.                         <volume prefix=", "></volume>
  22166.                         <pages prefix=", "></pages>
  22167.                         <access prefix=" "></access>
  22168.                     </type>
  22169.                     <type name="article">
  22170.                         <author></author>
  22171.                         <titles prefix=", " quotes="true"></titles>
  22172.                         <titles prefix=", " relation="container" font-style="italic"/>
  22173.                         <date prefix=", ">
  22174.                             <day suffix=" "></day>
  22175.                             <month suffix=" " text-case="capitalize-first"></month>
  22176.                             <year></year>
  22177.                         </date>
  22178.                         <pages prefix=", "></pages>
  22179.                         <access prefix=" "></access>
  22180.                     </type>
  22181.                     <type name="article-journal">
  22182.                         <author></author>
  22183.                         <titles prefix=", " quotes="true"></titles>
  22184.                         <titles prefix=", " relation="container" font-style="italic"/>
  22185.                         <volume prefix=", "></volume>
  22186.                         <issue prefix="."></issue>
  22187.                         <date prefix=" (" suffix=")"></date>
  22188.                         <pages prefix=", ">
  22189.                             <number></number>
  22190.                         </pages>
  22191.                         <access prefix=" "></access>
  22192.                     </type>
  22193.                 </choose>
  22194.             </item>
  22195.         </layout>
  22196.     </citation>
  22197. </style>
  22198. ');
  22199.  
  22200. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/mla', '2008-02-02 00:00:00', 'Modern Language Association',
  22201. '<?xml version="1.0" encoding="UTF-8"?>
  22202. <?oxygen RNGSchema="http://xbiblio.svn.sourceforge.net/viewvc/*checkout*/xbiblio/csl/schema/trunk/csl.rnc" type="compact"?>
  22203. <style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" xml:lang="en">
  22204.   <info>
  22205.     <title>Modern Language Association</title>
  22206.     <id>http://www.zotero.org/styles/mla</id>
  22207.     <link href="http://www.zotero.org/styles/mla"/>
  22208.     <author>
  22209.       <name>Simon Kornblith</name>
  22210.       <email>simon@simonster.com</email>
  22211.     </author>
  22212.     <category term="generic-base"/>
  22213.     <category term="author-date"/>
  22214.     <updated>2008-02-02T00:00:00+00:00</updated>
  22215.   </info>
  22216.   <macro name="editor-translator">
  22217.     <names variable="editor translator" delimiter=". ">
  22218.       <label form="verb-short" text-case="capitalize-first" suffix=". "/>
  22219.       <name and="symbol" delimiter=", "/>
  22220.     </names>
  22221.   </macro>
  22222.   <macro name="author">
  22223.     <names variable="author">
  22224.       <name name-as-sort-order="first" and="text" sort-separator=", "
  22225.         delimiter=", " delimiter-precedes-last="always"/>
  22226.       <label form="short" prefix=", " suffix="."/>
  22227.       <substitute>
  22228.         <names variable="editor"/>
  22229.         <names variable="translator"/>
  22230.         <text macro="title"/>
  22231.       </substitute>
  22232.     </names>
  22233.   </macro>
  22234.   <macro name="author-short">
  22235.     <names variable="author">
  22236.       <name form="short" and="symbol" delimiter=", " initialize-with=". "/>
  22237.       <substitute>
  22238.         <names variable="editor"/>
  22239.         <names variable="translator"/>
  22240.         <text macro="title-short"/>
  22241.       </substitute>
  22242.     </names>
  22243.   </macro>
  22244.   <macro name="access">
  22245.     <group delimiter=" ">
  22246.       <date variable="accessed">
  22247.         <date-part name="day" suffix=" "/>
  22248.         <date-part name="month" form="short" include-period="true" suffix=" "/>
  22249.         <date-part name="year"/>
  22250.       </date>
  22251.       <text variable="URL" prefix="<" suffix=">"/>
  22252.     </group>
  22253.   </macro>
  22254.   <macro name="title">
  22255.     <choose>
  22256.       <if type="book">
  22257.         <text variable="title" text-decoration="underline"/>
  22258.       </if>
  22259.       <else>
  22260.         <text variable="title" quotes="true"/>
  22261.       </else>
  22262.     </choose>
  22263.   </macro>
  22264.   <macro name="title-short">
  22265.     <choose>
  22266.       <if type="book">
  22267.         <text variable="title" form="short" text-decoration="underline"/>
  22268.       </if>
  22269.       <else>
  22270.         <text variable="title" form="short" quotes="true"/>
  22271.       </else>
  22272.     </choose>
  22273.   </macro>
  22274.   <macro name="publisher-year">
  22275.     <group delimiter=", ">
  22276.       <group delimiter=": ">
  22277.         <text variable="publisher-place"/>
  22278.         <text variable="publisher"/>
  22279.       </group>
  22280.       <date variable="issued">
  22281.         <date-part name="year"/>
  22282.       </date>
  22283.     </group>
  22284.   </macro>
  22285.   <citation>
  22286.     <option name="et-al-min" value="4"/>
  22287.     <option name="et-al-use-first" value="1"/>
  22288.     <option name="disambiguate-add-names" value="true"/>
  22289.     <option name="disambiguate-add-givenname" value="true"/>
  22290.     <layout prefix="(" suffix=")" delimiter="; ">
  22291.       <group delimiter=" ">
  22292.         <choose>
  22293.           <if variable="author editor translator" match="any">
  22294.             <group delimiter=", ">
  22295.           <text macro="author-short"/>
  22296.           <choose>
  22297.             <if disambiguate="true">
  22298.               <text macro="title-short"/>
  22299.             </if>
  22300.           </choose>
  22301.             </group>
  22302.           </if>
  22303.           <else>
  22304.             <text macro="title-short"/>
  22305.           </else>
  22306.         </choose>
  22307.         <text variable="locator"/>
  22308.       </group>
  22309.     </layout>
  22310.   </citation>
  22311.   <bibliography>
  22312.     <option name="hanging-indent" value="true"/>
  22313.     <option name="et-al-min" value="4"/>
  22314.     <option name="et-al-use-first" value="1"/>
  22315.     <option name="line-spacing" value="2"/>
  22316.     <sort>
  22317.       <key macro="author"/>
  22318.       <key variable="title"/>
  22319.     </sort>
  22320.     <layout>
  22321.       <text macro="author" suffix="."/>
  22322.       <text macro="title" prefix=" " suffix="."/>
  22323.       <choose>
  22324.         <if type="book">
  22325.           <text macro="editor-translator" prefix=" " suffix="."/>
  22326.           <text macro="publisher-year"  prefix=" " suffix="."/>
  22327.         </if>
  22328.         <else-if type="chapter">
  22329.           <group class="container">
  22330.             <text variable="container-title" text-decoration="underline" prefix=" " suffix="."/>
  22331.             <text macro="editor-translator" prefix=" " suffix="."/>
  22332.             <text macro="publisher-year"  prefix=" " suffix="."/>
  22333.           </group>
  22334.           <text variable="page" prefix=" " suffix="."/>
  22335.         </else-if>
  22336.         <else>
  22337.           <group class="container" prefix=" " suffix="." delimiter=": ">
  22338.             <group delimiter=" ">
  22339.               <text macro="editor-translator" suffix="."/>
  22340.               <text variable="container-title" text-decoration="underline"/>
  22341.               <choose>
  22342.                 <if type="article-journal">
  22343.                   <group delimiter=" ">
  22344.                     <group delimiter=".">
  22345.                       <text variable="volume"/>
  22346.                       <text variable="issue"/>
  22347.                     </group>
  22348.                     <date variable="issued" prefix="(" suffix=")">
  22349.                       <date-part name="year"/>
  22350.                     </date>
  22351.                   </group>
  22352.                 </if>
  22353.                 <else>
  22354.                   <date variable="issued">
  22355.                     <date-part name="day" suffix=" "/>
  22356.                     <date-part name="month" form="short" include-period="true" suffix=" "/>
  22357.                     <date-part name="year"/>
  22358.                   </date>
  22359.                 </else>
  22360.               </choose>
  22361.             </group>
  22362.             <text variable="page"/>
  22363.           </group>
  22364.         </else>
  22365.       </choose>
  22366.       <text prefix=" " suffix="." macro="access"/>
  22367.     </layout>
  22368.   </bibliography>
  22369. </style>
  22370. ');
  22371.  
  22372. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/nature', '2008-02-02 00:00:00', 'Nature Journal',
  22373. '<?xml version="1.0" encoding="UTF-8"?>
  22374. <?oxygen RNGSchema="http://xbiblio.svn.sourceforge.net/viewvc/*checkout*/xbiblio/csl/schema/trunk/csl.rnc" type="compact"?>
  22375. <style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" xml:lang="en">
  22376.     <info>
  22377.         <title>Nature Journal</title>
  22378.         <id>http://www.zotero.org/styles/nature</id>
  22379.         <link href="http://www.zotero.org/styles/nature"/>
  22380.         <author>
  22381.             <name>Michael Berkowitz</name>
  22382.             <email>mberkowi@gmu.edu</email>
  22383.         </author>
  22384.         <category term="biology"/>
  22385.         <category term="generic-base"/>
  22386.         <category term="numeric"/>
  22387.         <updated>2008-02-02T00:00:00+00:00</updated>
  22388.     </info>
  22389.     <macro name="author">
  22390.         <names variable="author">
  22391.             <name sort-separator=", " delimiter=", " and="symbol" initialize-with="." delimiter-precedes-last="never" name-as-sort-order="all"/>
  22392.         </names>
  22393.     </macro>
  22394.     <macro name="access">
  22395.         <choose>
  22396.             <if variable="volume"/>
  22397.             <else-if variable="DOI">
  22398.                 <text variable="DOI" prefix="doi:"/>
  22399.             </else-if>
  22400.             <else-if variable="URL">
  22401.                 <text term="at"/>
  22402.                 <text variable="URL" prefix=" <" suffix=">"/>
  22403.             </else-if>
  22404.         </choose>
  22405.     </macro>
  22406.     <citation>
  22407.         <option name="collapse" value="citation-number"/>
  22408.         <sort>
  22409.             <key variable="citation-number"/>
  22410.         </sort>
  22411.         <layout vertical-align="sup" delimiter=",">
  22412.             <text variable="citation-number"/>
  22413.         </layout>
  22414.     </citation>
  22415.     <bibliography>
  22416.         <option name="et-al-min" value="4"/>
  22417.         <option name="et-al-use-first" value="1"/>
  22418.         <option name="second-field-align" value="true"/>
  22419.         <option name="entry-spacing" value="0"/>
  22420.         <layout>
  22421.             <text variable="citation-number" suffix=". "/>
  22422.             <text macro="author"/>
  22423.             <text variable="title" prefix=" " suffix=". "/>
  22424.             <text variable="container-title" font-style="italic" suffix=" "/>
  22425.             <text variable="volume" suffix=", " font-weight="bold"/>
  22426.             <text variable="page"/>
  22427.             <text macro="access"/>
  22428.             <date prefix=" (" suffix=")." variable="issued">
  22429.                 <date-part name="year"/>
  22430.             </date>
  22431.         </layout>
  22432.     </bibliography>
  22433. </style>
  22434. ');
  22435.  
  22436. REPLACE INTO csl VALUES ('http://www.zotero.org/styles/nlm', '2008-02-02 00:00:00', 'National Library of Medicine',
  22437. '<?xml version="1.0" encoding="UTF-8"?>
  22438. <?oxygen RNGSchema="http://xbiblio.svn.sourceforge.net/viewvc/*checkout*/xbiblio/csl/schema/trunk/csl.rnc" type="compact"?>
  22439. <style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" xml:lang="en">
  22440.   <info>
  22441.     <title>National Library of Medicine</title>
  22442.     <id>http://www.zotero.org/styles/nlm</id>
  22443.     <link href="http://www.zotero.org/styles/nlm"/>
  22444.     <author>
  22445.       <name>Michael Berkowitz</name>
  22446.       <email>mberkowi@gmu.edu</email>
  22447.     </author>
  22448.     <category term="generic-base"/>
  22449.     <category term="numeric"/>
  22450.     <updated>2008-02-02T00:00:00+00:00</updated>
  22451.   </info>
  22452.   <macro name="author">
  22453.     <names variable="author" suffix=". ">
  22454.       <name sort-separator=" " initialize-with="" name-as-sort-order="all" delimiter=", " delimiter-precedes-last="always"/>
  22455.     </names>
  22456.   </macro>
  22457.   <macro name="editor">
  22458.     <names variable="editor" suffix=", editor(s). ">
  22459.       <name sort-separator=" " initialize-with="" name-as-sort-order="all" delimiter=", " delimiter-precedes-last="always"/>
  22460.     </names>
  22461.   </macro>
  22462.   <macro name="publisher">
  22463.     <text variable="publisher-place" suffix=": "/>
  22464.     <text variable="publisher" suffix="; "/>
  22465.     <date variable="issued">
  22466.       <date-part name="year" suffix=". "/>
  22467.     </date>
  22468.   </macro>
  22469.   <macro name="access">
  22470.     <group delimiter=" ">
  22471.       <group prefix="[" suffix="]" delimiter=" ">
  22472.     <text term="cited" text-case="lowercase"/>
  22473.     <date variable="accessed" suffix=" ">
  22474.       <date-part name="year"/>
  22475.       <date-part name="month" prefix=" " form="short"/>
  22476.       <date-part name="day" prefix=" "/>
  22477.     </date>
  22478.       </group>
  22479.       <group>
  22480.     <text value="Available from: "/>
  22481.     <text variable="URL"/>
  22482.       </group>
  22483.     </group>
  22484.   </macro>
  22485.   <macro name="title">
  22486.     <group delimiter=" ">
  22487.       <text variable="title"/>
  22488.       <choose>
  22489.     <if variable="URL">
  22490.       <text term="internet" prefix="[" suffix="]" text-case="capitalize-first"/>
  22491.     </if>
  22492.       </choose>
  22493.     </group>
  22494.   </macro>
  22495.   <macro name="edition">
  22496.     <choose>
  22497.       <if is-numeric="edition">
  22498.     <group delimiter=" ">
  22499.       <number variable="edition" form="ordinal"/>
  22500.       <text term="edition" form="short" suffix="."/>
  22501.     </group>
  22502.       </if>
  22503.       <else>
  22504.       <text variable="edition" suffix="."/>
  22505.       </else>
  22506.     </choose>
  22507.   </macro>
  22508.   <citation>
  22509.     <option name="collapse" value="citation-number"/>
  22510.     <sort>
  22511.       <key variable="citation-number"/>
  22512.     </sort>
  22513.     <layout prefix="(" suffix=")" delimiter="; ">
  22514.       <text variable="citation-number"/>
  22515.     </layout>
  22516.   </citation>
  22517.   <bibliography>
  22518.     <option name="et-al-min" value="7"/>
  22519.     <option name="et-al-use-first" value="6"/>
  22520.     <option name="second-field-align" value="true"/>
  22521.     <layout>
  22522.       <text variable="citation-number" suffix=". "/>
  22523.       <text macro="author"/>
  22524.       <text macro="title" suffix=". "/>
  22525.       <choose>
  22526.     <if type="book">
  22527.       <text macro="edition" prefix=" " suffix=" "/>
  22528.       <text macro="publisher" prefix=" "/>
  22529.     </if>
  22530.     <else-if type="chapter">
  22531.       <group prefix=" " suffix=". ">
  22532.         <text term="in" suffix=": " text-case="capitalize-first"/>
  22533.         <text macro="editor"/>
  22534.         <text variable="container-title"/>
  22535.       </group>
  22536.       <text macro="publisher" prefix=" "/>
  22537.       <text variable="page" prefix=" p. " suffix="."/>
  22538.     </else-if>
  22539.     <else>
  22540.       <text variable="container-title" suffix=". " form="short"/>
  22541.       <date variable="issued" suffix=";">
  22542.         <date-part name="year" suffix=" "/>
  22543.         <date-part name="month" form="short" suffix=" "/>
  22544.         <date-part name="day"/>
  22545.       </date>
  22546.       <text variable="volume"/>
  22547.       <text variable="issue" prefix="(" suffix="):"/>
  22548.       <text variable="page" suffix="."/>
  22549.     </else>
  22550.       </choose>
  22551.       <text macro="access"/>
  22552.     </layout>
  22553.   </bibliography>
  22554. </style>
  22555. ');
  22556.